diff options
author | yaohuang <yaohuang@microsoft.com> | 2012-04-03 02:31:46 +0400 |
---|---|---|
committer | yaohuang <yaohuang@microsoft.com> | 2012-04-04 22:09:53 +0400 |
commit | 590ee02f487fd0f2d7822f210d9e564ab6d4db62 (patch) | |
tree | 6033c77e9b6e9e4ac4313a74e9a8b49b21cccddf /src/System.Web.Http.WebHost | |
parent | c28443ac44b14438356bea5b8ba57494289e31a4 (diff) |
349089: Fixing the issue where HttpMethodConstraint does not work for WebAPI on Web Host
Diffstat (limited to 'src/System.Web.Http.WebHost')
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" /> |