/// <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);
        }
Exemplo n.º 4
0
 private ResolvedRouteInfo GetActualRouteInfo()
 {
     return(this.actualRouteInfo ??
            (this.actualRouteInfo = InternalRouteResolver.Resolve(this.HttpConfiguration, this.requestMessage)));
 }