Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/aspnetwebstack.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoryaohuang <yaohuang@microsoft.com>2012-04-03 02:31:46 +0400
committeryaohuang <yaohuang@microsoft.com>2012-04-04 22:09:53 +0400
commit590ee02f487fd0f2d7822f210d9e564ab6d4db62 (patch)
tree6033c77e9b6e9e4ac4313a74e9a8b49b21cccddf /src/System.Web.Http.WebHost
parentc28443ac44b14438356bea5b8ba57494289e31a4 (diff)
349089: Fixing the issue where HttpMethodConstraint does not work for WebAPI on Web Host
Diffstat (limited to 'src/System.Web.Http.WebHost')
-rw-r--r--src/System.Web.Http.WebHost/HttpControllerHandler.cs8
-rw-r--r--src/System.Web.Http.WebHost/Routing/HttpContextBaseExtensions.cs29
-rw-r--r--src/System.Web.Http.WebHost/Routing/HttpWebRoute.cs35
-rw-r--r--src/System.Web.Http.WebHost/System.Web.Http.WebHost.csproj1
4 files changed, 69 insertions, 4 deletions
diff --git a/src/System.Web.Http.WebHost/HttpControllerHandler.cs b/src/System.Web.Http.WebHost/HttpControllerHandler.cs
index 3e00b2f5..4a90d408 100644
--- a/src/System.Web.Http.WebHost/HttpControllerHandler.cs
+++ b/src/System.Web.Http.WebHost/HttpControllerHandler.cs
@@ -138,7 +138,7 @@ namespace System.Web.Http.WebHost
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Object gets passed to a task")]
protected virtual IAsyncResult BeginProcessRequest(HttpContextBase httpContextBase, AsyncCallback callback, object state)
{
- HttpRequestMessage request = ConvertRequest(httpContextBase);
+ HttpRequestMessage request = httpContextBase.GetHttpRequestMessage() ?? ConvertRequest(httpContextBase);
// Add route data
request.Properties[HttpPropertyKeys.HttpRouteDataKey] = _routeData;
@@ -356,7 +356,7 @@ namespace System.Web.Http.WebHost
}
[SuppressMessage("Microsoft.Reliability", "CA2000:Dispose objects before losing scope", Justification = "Caller becomes owner")]
- private static HttpRequestMessage ConvertRequest(HttpContextBase httpContextBase)
+ internal static HttpRequestMessage ConvertRequest(HttpContextBase httpContextBase)
{
Contract.Assert(httpContextBase != null);
@@ -384,12 +384,12 @@ namespace System.Web.Http.WebHost
/// setting <see cref="P:System.Web.HttpResponseBase.SuppressFormsAuthenticationRedirect" /> to <c>true</c> if available.
/// </summary>
/// <param name="httpContextBase">The HTTP context base.</param>
- internal static void EnsureSuppressFormsAuthenticationRedirect(HttpContextBase httpContextBase)
+ internal static void EnsureSuppressFormsAuthenticationRedirect(HttpContextBase httpContextBase)
{
Contract.Assert(httpContextBase != null);
// Only if the response is status code is 401
- if (httpContextBase.Response.StatusCode == (int)HttpStatusCode.Unauthorized)
+ if (httpContextBase.Response.StatusCode == (int)HttpStatusCode.Unauthorized)
{
_suppressRedirectAction.Value(httpContextBase);
}
diff --git a/src/System.Web.Http.WebHost/Routing/HttpContextBaseExtensions.cs b/src/System.Web.Http.WebHost/Routing/HttpContextBaseExtensions.cs
new file mode 100644
index 00000000..8a6b6661
--- /dev/null
+++ b/src/System.Web.Http.WebHost/Routing/HttpContextBaseExtensions.cs
@@ -0,0 +1,29 @@
+using System.Net.Http;
+
+namespace System.Web.Http.WebHost.Routing
+{
+ internal static class HttpContextBaseExtensions
+ {
+ internal static readonly string HttpRequestMessageKey = "MS_HttpRequestMessage";
+
+ public static HttpRequestMessage GetHttpRequestMessage(this HttpContextBase context)
+ {
+ if (context == null)
+ {
+ throw Error.ArgumentNull("context");
+ }
+
+ if (!context.Items.Contains(HttpRequestMessageKey))
+ {
+ return null;
+ }
+
+ return context.Items[HttpRequestMessageKey] as HttpRequestMessage;
+ }
+
+ public static void SetHttpRequestMessage(this HttpContextBase context, HttpRequestMessage request)
+ {
+ context.Items.Add(HttpRequestMessageKey, request);
+ }
+ }
+}
diff --git a/src/System.Web.Http.WebHost/Routing/HttpWebRoute.cs b/src/System.Web.Http.WebHost/Routing/HttpWebRoute.cs
index 29b34c1e..fdc35a01 100644
--- a/src/System.Web.Http.WebHost/Routing/HttpWebRoute.cs
+++ b/src/System.Web.Http.WebHost/Routing/HttpWebRoute.cs
@@ -1,5 +1,7 @@
using System.Collections.Generic;
using System.Diagnostics.CodeAnalysis;
+using System.Net.Http;
+using System.Web.Http.Routing;
using System.Web.Routing;
namespace System.Web.Http.WebHost.Routing
@@ -42,6 +44,24 @@ namespace System.Web.Http.WebHost.Routing
{
}
+ protected override bool ProcessConstraint(HttpContextBase httpContext, object constraint, string parameterName, RouteValueDictionary values, RouteDirection routeDirection)
+ {
+ IHttpRouteConstraint httpRouteConstraint = constraint as IHttpRouteConstraint;
+ if (httpRouteConstraint != null)
+ {
+ HttpRequestMessage request = httpContext.GetHttpRequestMessage();
+ if (request == null)
+ {
+ request = HttpControllerHandler.ConvertRequest(httpContext);
+ httpContext.SetHttpRequestMessage(request);
+ }
+
+ return httpRouteConstraint.Match(request, new HostedHttpRoute(this), parameterName, values, ConvertRouteDirection(routeDirection));
+ }
+
+ return base.ProcessConstraint(httpContext, constraint, parameterName, values, routeDirection);
+ }
+
public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
// Only perform URL generation if the "httproute" key was specified. This allows these
@@ -70,5 +90,20 @@ namespace System.Web.Http.WebHost.Routing
}
return newRouteValues;
}
+
+ private static HttpRouteDirection ConvertRouteDirection(RouteDirection routeDirection)
+ {
+ if (routeDirection == RouteDirection.IncomingRequest)
+ {
+ return HttpRouteDirection.UriResolution;
+ }
+
+ if (routeDirection == RouteDirection.UrlGeneration)
+ {
+ return HttpRouteDirection.UriGeneration;
+ }
+
+ throw Error.InvalidEnumArgument("routeDirection", (int)routeDirection, typeof(RouteDirection));
+ }
}
}
diff --git a/src/System.Web.Http.WebHost/System.Web.Http.WebHost.csproj b/src/System.Web.Http.WebHost/System.Web.Http.WebHost.csproj
index 7ba2f38a..f3d3b121 100644
--- a/src/System.Web.Http.WebHost/System.Web.Http.WebHost.csproj
+++ b/src/System.Web.Http.WebHost/System.Web.Http.WebHost.csproj
@@ -82,6 +82,7 @@
</Compile>
<Compile Include="PreApplicationStartCode.cs" />
<Compile Include="HttpControllerTypeCacheSerializer.cs" />
+ <Compile Include="Routing\HttpContextBaseExtensions.cs" />
<Compile Include="WebHostHttpControllerTypeResolver.cs" />
<Compile Include="Routing\HostedHttpRouteCollection.cs" />
<Compile Include="Routing\HostedHttpRoute.cs" />