/// <summary> /// Resolves HTTP request message to a route using the provided HTTP configuration and the internal ASP.NET Web API route resolving algorithm. /// </summary> /// <param name="config">HttpConfiguration to use.</param> /// <param name="request">HttpRequestMessage to resolve.</param> /// <returns>Resolved route information.</returns> public static ResolvedRouteInfo Resolve(HttpConfiguration config, HttpRequestMessage request) { config.EnsureInitialized(); // transform the URI to fake absolute one since ASP.NET Web API internal route resolver does no support non-absolute URIs var originalRoute = request.RequestUri; request.TransformToAbsoluteRequestUri(); var routeData = config.Routes.GetRouteData(request); if (routeData == null) { request.RequestUri = originalRoute; return(new ResolvedRouteInfo("route does not exist")); } request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData; request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; routeData.RemoveOptionalRoutingParameters(); ResolvedRouteInfo resolvedRouteInfo; try { var controllerContext = GetHttpControllerContext(config, request, routeData); var actionContext = GetHttpActionContext(config, controllerContext); resolvedRouteInfo = new ResolvedRouteInfo( controllerContext.ControllerDescriptor.ControllerType, actionContext.ActionDescriptor.ActionName, actionContext.ActionArguments, routeData.Route.Handler, actionContext.ModelState); } catch (HttpResponseException ex) { resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, ex.Response.ReasonPhrase)); } catch (AggregateException ex) { var innerException = (HttpResponseException)ex.InnerExceptions.First(); resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, innerException.Response.ReasonPhrase)); } catch (Exception ex) { resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, ex.Message.Split(':').First())); } request.RequestUri = originalRoute; return(resolvedRouteInfo); }
/// <summary> /// Resolves HTTP request message to a route using the provided HTTP configuration and the internal ASP.NET Web API route resolving algorithm. /// </summary> /// <param name="config">HttpConfiguration to use.</param> /// <param name="request">HttpRequestMessage to resolve.</param> /// <returns>Resolved route information.</returns> public static ResolvedRouteInfo Resolve(HttpConfiguration config, HttpRequestMessage request) { config.EnsureInitialized(); // transform the URI to fake absolute one since ASP.NET Web API internal route resolver does no support non-absolute URIs var originalRoute = request.RequestUri; request.TransformToAbsoluteRequestUri(); var routeData = config.Routes.GetRouteData(request); if (routeData == null) { request.RequestUri = originalRoute; return new ResolvedRouteInfo("route does not exist"); } request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData; request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; routeData.RemoveOptionalRoutingParameters(); ResolvedRouteInfo resolvedRouteInfo; try { var controllerContext = GetHttpControllerContext(config, request, routeData); var actionContext = GetHttpActionContext(config, controllerContext); resolvedRouteInfo = new ResolvedRouteInfo( controllerContext.ControllerDescriptor.ControllerType, actionContext.ActionDescriptor.ActionName, actionContext.ActionArguments, routeData.Route.Handler, actionContext.ModelState); } catch (HttpResponseException ex) { resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, ex.Response.ReasonPhrase)); } catch (AggregateException ex) { var innerException = (HttpResponseException)ex.InnerExceptions.First(); resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, innerException.Response.ReasonPhrase)); } catch (Exception ex) { resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, ex.Message.Split(':').First())); } request.RequestUri = originalRoute; return resolvedRouteInfo; }
/// <summary> /// Resolves HTTP request message to a route using the provided HTTP configuration and the internal ASP.NET Web API route resolving algorithm. /// </summary> /// <param name="config">HttpConfiguration to use.</param> /// <param name="request">HttpRequestMessage to resolve.</param> /// <returns>Resolved route information.</returns> public static ResolvedRouteInfo Resolve(HttpConfiguration config, HttpRequestMessage request) { try { config.EnsureInitialized(); } catch (InvalidOperationException ex) { if (ex.IsRouteConstraintRelatedException()) { throw new UnresolvedRouteConstraintsException("An error occurred while resolving your routes. If you are using custom route constraints, please call WithInlineConstgraintResolver method with appropriate IInlineConstraintResolver instance after httpConfiguration setup."); } throw ex; } // transform the URI to fake absolute one since ASP.NET Web API internal route resolver does no support non-absolute URIs var originalRoute = request.RequestUri; request.TransformToAbsoluteRequestUri(); var routeData = config.Routes.GetRouteData(request); if (routeData == null) { request.RequestUri = originalRoute; return(new ResolvedRouteInfo("route does not exist")); } request.Properties[HttpPropertyKeys.HttpRouteDataKey] = routeData; request.Properties[HttpPropertyKeys.HttpConfigurationKey] = config; routeData.RemoveOptionalRoutingParameters(); ResolvedRouteInfo resolvedRouteInfo; try { var controllerContext = GetHttpControllerContext(config, request, routeData); var actionContext = GetHttpActionContext(config, controllerContext); resolvedRouteInfo = new ResolvedRouteInfo( controllerContext.ControllerDescriptor.ControllerType, actionContext.ActionDescriptor.ActionName, actionContext.ActionArguments, routeData.Route.Handler, actionContext.ModelState); } catch (HttpResponseException ex) { resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, ex.Response.ReasonPhrase)); } catch (AggregateException ex) { var innerException = (HttpResponseException)ex.InnerExceptions.First(); resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, innerException.Response.ReasonPhrase)); } catch (Exception ex) { resolvedRouteInfo = new ResolvedRouteInfo(string.Format( UnresolvedRouteFormat, ex.Message.Split(':').First())); } request.RequestUri = originalRoute; return(resolvedRouteInfo); }
private ResolvedRouteInfo GetActualRouteInfo() { return(this.actualRouteInfo ?? (this.actualRouteInfo = InternalRouteResolver.Resolve(this.HttpConfiguration, this.requestMessage))); }