예제 #1
0
        public void TestRoute(string url, string verb, Type type, string actionName)
        {
            //Arrange
            url = url.Replace("{apiVersionNumber}", this.ApiVersionNumber);
            url = Host + url;

            //Act
            HttpRequestMessage request = new HttpRequestMessage(new HttpMethod(verb), url);

            IHttpControllerSelector controller = this.GetControllerSelector();
            IHttpActionSelector     action     = this.GetActionSelector();

            IHttpRouteData route = this.Config.Routes.GetRouteData(request);

            request.Properties[HttpPropertyKeys.HttpRouteDataKey]     = route;
            request.Properties[HttpPropertyKeys.HttpConfigurationKey] = this.Config;

            HttpControllerDescriptor controllerDescriptor = controller.SelectController(request);

            HttpControllerContext context = new HttpControllerContext(this.Config, route, request)
            {
                ControllerDescriptor = controllerDescriptor
            };

            var actionDescriptor = action.SelectAction(context);

            //Assert
            Assert.NotNull(controllerDescriptor);
            Assert.NotNull(actionDescriptor);
            Assert.Equal(type, controllerDescriptor.ControllerType);
            Assert.Equal(actionName, actionDescriptor.ActionName);
        }
예제 #2
0
 /// <summary>
 /// Selects the action for the controller.
 /// </summary>
 /// <param name="controllerContext">The context of the controller.</param>
 /// <returns>The action for the controller.</returns>
 public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
 {
     if (_innerSelector != null)
     {
         var result = _innerSelector.SelectAction(controllerContext);
         return(result);
     }
     throw new NotImplementedException();
 }
예제 #3
0
        public IEnumerable <Tuple <string, FilterScope> > Get()
        {
            IHttpActionSelector  actionSelector   = this.Configuration.Services.GetActionSelector();
            HttpActionDescriptor actionDescriptor = actionSelector.SelectAction(this.ControllerContext);

            foreach (FilterInfo filterInfo in actionDescriptor.GetFilterPipeline())
            {
                yield return(new Tuple <string, FilterScope>(filterInfo.Instance.GetType().Name, filterInfo.Scope));
            }
        }
예제 #4
0
 /// <summary>
 /// Gets the action descriptor.
 /// </summary>
 /// <param name="a_controllerContext">
 /// The controller context.
 /// </param>
 /// <returns>
 /// The action descriptor for the controller context.
 /// </returns>
 private HttpActionDescriptor GetActionDescriptor(HttpControllerContext a_controllerContext)
 {
     try
     {
         return(m_actionSelector.SelectAction(a_controllerContext));
     }
     catch (InvalidOperationException)
     {
         return(null);
     }
 }
예제 #5
0
    public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
    {
        // Get HttpMethod from current context
        HttpMethod httpMethod = controllerContext.Request.Method;

        // Set route values for API
        controllerContext.RouteData.Values.Add("action", httpMethod.Method);

        // Invoke Action
        return(defaultSelector.SelectAction(controllerContext));
    }
예제 #6
0
        public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            if (controllerContext == null)
            {
                throw Error.ArgumentNull("controllerContext");
            }

            HttpRequestMessage request   = controllerContext.Request;
            ODataPath          odataPath = request.ODataProperties().Path;
            IEnumerable <IODataRoutingConvention> routingConventions = request.GetRoutingConventions();
            IHttpRouteData routeData = controllerContext.RouteData;

            if (odataPath == null || routingConventions == null || routeData.Values.ContainsKey(ODataRouteConstants.Action))
            {
                return(_innerSelector.SelectAction(controllerContext));
            }

            ILookup <string, HttpActionDescriptor> actionMap = _innerSelector.GetActionMapping(controllerContext.ControllerDescriptor);

            foreach (IODataRoutingConvention routingConvention in routingConventions)
            {
                string actionName = routingConvention.SelectAction(
                    odataPath,
                    controllerContext,
                    actionMap);

                if (actionName != null)
                {
                    routeData.Values[ODataRouteConstants.Action] = actionName;
                    var action = _innerSelector.SelectAction(controllerContext);
                    if (ActionParametersMatchRequest(action, controllerContext))
                    {
                        return(action);
                    }
                }
            }

            throw new HttpResponseException(CreateErrorResponse(request, HttpStatusCode.NotFound,
                                                                Error.Format(SRResources.NoMatchingResource, controllerContext.Request.RequestUri),
                                                                Error.Format(SRResources.NoRoutingHandlerToSelectAction, odataPath.PathTemplate)));
        }
예제 #7
0
        public override Task <HttpResponseMessage> ExecuteAsync(HttpControllerContext controllerContext, CancellationToken cancellationToken)
        {
            this.Initialize(controllerContext);

            IHttpActionSelector      actionSelector       = this.Configuration.Services.GetActionSelector();
            HttpControllerDescriptor controllerDescriptor = this.ControllerContext.ControllerDescriptor;
            HttpActionDescriptor     actionDescriptor     = actionSelector.SelectAction(controllerContext);
            HttpActionContext        actionContext        = new HttpActionContext(controllerContext, actionDescriptor);

            actionDescriptor.ActionBinding.ExecuteBindingAsync(actionContext, cancellationToken).Wait();
            return(this.Configuration.Services.GetActionInvoker().InvokeActionAsync(actionContext, cancellationToken));
        }
예제 #8
0
 public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
 {
     try
     {
         return(_concreteSelector.SelectAction(controllerContext));
     }
     catch (HttpResponseException ex)
     {
         _clientCreator.GenerateRaygunWebApiClient().CurrentHttpRequest(controllerContext.Request).SendInBackground(ex);
         throw;
     }
 }
예제 #9
0
        public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            var request = controllerContext.Request;

            if (request.IsInspectRequest())
            {
                var simulate = new ActionSelectSimulator();
                request.Properties[RequestHelper.ActionCache] = simulate.Simulate(controllerContext);
            }

            var selectedAction = _innerSelector.SelectAction(controllerContext);

            return(selectedAction);
        }
예제 #10
0
 public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
 {
     try
     {
         return(_concreteSelector.SelectAction(controllerContext));
     }
     catch (HttpResponseException ex)
     {
         _clientCreator.GenerateRaygunWebApiClient(controllerContext.Request).SendInBackground(ex, new List <string> {
             RaygunWebApiClient.UnhandledExceptionTag
         });
         throw;
     }
 }
예제 #11
0
        public override RequestAnalysisResult GetRequestAnalysis(RequestAnalysisContext analysisContext)
        {
            HttpRequestMessage request           = analysisContext.RequestMessage;
            HttpConfiguration  httpConfiguration = request.GetConfiguration();
            IHttpRouteData     httpRouteData     = httpConfiguration.Routes.GetRouteData(request);

            request.SetRouteData(httpRouteData);
            //IAssembliesResolver assembliesResolver= httpConfiguration.Services.GetAssembliesResolver();
            //IHttpControllerTypeResolver controllerTypeResolver = httpConfiguration.Services.GetHttpControllerTypeResolver();
            //ICollection<Type> controllerTypes= controllerTypeResolver.GetControllerTypes(assembliesResolver);
            IHttpControllerSelector  controllerSelector   = httpConfiguration.Services.GetHttpControllerSelector();
            HttpControllerDescriptor controllerDescriptor = controllerSelector.SelectController(request);

            HttpControllerContext controllerContext = new HttpControllerContext(httpConfiguration, httpRouteData, request);

            controllerContext.ControllerDescriptor = controllerDescriptor;
            IHttpActionSelector  actionSelector   = httpConfiguration.Services.GetActionSelector();
            HttpActionDescriptor actionDescriptor = actionSelector.SelectAction(controllerContext);


            RequestAnalysisResult analysisResult = new RequestAnalysisResult();

            analysisResult.Url = request.RequestUri.ToString();
            analysisResult.SupportedHttpMethods = actionDescriptor.SupportedHttpMethods.Select(method => method.Method).ToArray();
            analysisResult.Parameters           = actionDescriptor.GetParameters().Select(parameter => parameter.ParameterName).ToArray();
            analysisResult.ActionName           = actionDescriptor.ActionName;
            analysisResult.ControllerName       = actionDescriptor.ControllerDescriptor.ControllerName;
            analysisResult.Values     = httpRouteData.Values;
            analysisResult.DataTokens = httpRouteData.Route.DataTokens;
            analysisResult.Mode       = Mode;

            string path = new DirectoryInfo(string.Format(@"{0}{1}", AppDomain.CurrentDomain.BaseDirectory, LookupPrefix)).FullName;

            analysisResult.FilePath = LookupFilePath(path, analysisResult.ControllerName);

            return(analysisResult);
        }
예제 #12
0
        HttpActionDescriptor IHttpActionSelector.SelectAction(HttpControllerContext controllerContext)
        {
            HttpActionDescriptor actionDescriptor = null;

            _traceWriter.TraceBeginEnd(
                controllerContext.Request,
                TraceCategories.ActionCategory,
                TraceLevel.Info,
                _innerSelector.GetType().Name,
                SelectActionMethodName,
                beginTrace: null,
                execute: () => { actionDescriptor = _innerSelector.SelectAction(controllerContext); },
                endTrace: (tr) =>
            {
                tr.Message = Error.Format(
                    SRResources.TraceActionSelectedMessage,
                    FormattingUtilities.ActionDescriptorToString(actionDescriptor));
            },

                errorTrace: null);

            // Intercept returned HttpActionDescriptor with a tracing version
            return(actionDescriptor == null ? null : new HttpActionDescriptorTracer(controllerContext, actionDescriptor, _traceWriter));
        }
        public override HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            var dynController = controllerContext.Controller as DynamicController;

            if (dynController != null)
            {
                //We want to use http verb only from inherited selection.
                var tempData = controllerContext.RouteData;
                controllerContext.RouteData = new HttpRouteData(controllerContext.RouteData.Route);
                var reflectedCandidate = (ReflectedHttpActionDescriptor)base.SelectAction(controllerContext);
                controllerContext.RouteData = tempData;


                string actionName        = null;
                bool   hasActionRouteKey = controllerContext.RouteData.Values.TryGetValue <string>("action", ref actionName);

                var candidateActions = dynController.ControllerInfo.DynamicActions
                                       .Where(candidateAction => candidateAction.Enabled && candidateAction.HttpVerbs.All.Contains(controllerContext.Request.Method.ToWebMethod()) &&
                                              ((!hasActionRouteKey && !candidateAction.EnforceActionName) ||
                                               (StringComparer.OrdinalIgnoreCase.Compare(candidateAction.Name, actionName) == 0)))
                                       .ToList();

                if (candidateActions.Count > 1)
                {
                    IDictionary <string, object> values = controllerContext.RouteData.Values;
                    var strRouteParams = new HashSet <string>(values.Keys, StringComparer.OrdinalIgnoreCase);
                    strRouteParams.Remove("controller");
                    if (hasActionRouteKey)
                    {
                        strRouteParams.Remove("action");
                    }
                    if (controllerContext.Request.RequestUri != null && !string.IsNullOrEmpty(controllerContext.Request.RequestUri.Query))
                    {
                        foreach (KeyValuePair <string, string> queryNameValuePair in controllerContext.Request.GetQueryNameValuePairs())
                        {
                            strRouteParams.Add(queryNameValuePair.Key);
                        }
                    }
                    foreach (DynamicAction objMethod in new List <DynamicAction>(candidateActions))
                    {
                        //removing actions with dynamic parameters not found in routeData
                        foreach (var pairActionDynamicParam in objMethod.ParametersDictionary)
                        {
                            if (!pairActionDynamicParam.Value.IsOptional)
                            {
                                if (!pairActionDynamicParam.Value.DynamicAttributes.Items.Any(objAttr => objAttr is FromBodyAttribute))
                                {
                                    if (!strRouteParams.Contains(pairActionDynamicParam.Key))
                                    {
                                        candidateActions.Remove(objMethod);
                                    }
                                }
                            }
                        }
                        if (candidateActions.Count > 1)
                        {
                            Object objDefaultValue = null;
                            foreach (string strRouteParam in strRouteParams)
                            {
                                if (!objMethod.ParametersDictionary.ContainsKey(strRouteParam) &&
                                    (!controllerContext.RouteData.Route.Defaults.TryGetValue(strRouteParam, out objDefaultValue) ||
                                     objDefaultValue != RouteParameter.Optional))
                                {
                                    candidateActions.Remove(objMethod);
                                }
                            }
                        }
                    }
                }
                if (candidateActions.Count > 1)
                {
                    candidateActions = candidateActions.GroupBy <DynamicAction, Int32>(method => method.Parameters.Count)
                                       .OrderByDescending(g => g.Key)
                                       .First()
                                       .ToList();
                }



                string templatedMessage;
                switch (candidateActions.Count)
                {
                case 0:
                    templatedMessage = DotNetNuke.Services.Localization.Localization.GetString("ActionNotFound.Message", PortalKeeperContext <RequestEvent> .SharedResourceFile);
                    throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(HttpStatusCode.NotFound,
                                                                                                  string.Format(templatedMessage, new object[3] {
                        controllerContext.Request.RequestUri != null ? controllerContext.Request.RequestUri.ToString() : "", controllerContext.ControllerDescriptor.ControllerName, actionName
                    })));

                case 1:
                    var candidateDynamicMethod = candidateActions[0];
                    var toReturn = new DynamicHttpActionDescriptor(dynController.Service, dynController.ControllerInfo, candidateDynamicMethod, reflectedCandidate);

                    return(toReturn);

                default:
                    templatedMessage = DotNetNuke.Services.Localization.Localization.GetString("AmbiguousAction.Message", PortalKeeperContext <RequestEvent> .SharedResourceFile);
                    throw new HttpResponseException(controllerContext.Request.CreateErrorResponse(HttpStatusCode.Ambiguous,
                                                                                                  string.Format(templatedMessage, new object[3] {
                        controllerContext.Request.RequestUri != null ? controllerContext.Request.RequestUri.ToString() : "", controllerContext.ControllerDescriptor.ControllerName, actionName
                    })));
                }
            }
            else
            {
                if (_originalActionSelector != null)
                {
                    return(_originalActionSelector.SelectAction(controllerContext));
                }
                return(base.SelectAction(controllerContext));
            }
        }
예제 #14
0
 public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
 {
     return(httpActionSelector.SelectAction(controllerContext));
 }
예제 #15
0
        public HttpActionDescriptor SelectAction(HttpControllerContext controllerContext)
        {
            if (controllerContext == null)
            {
                throw new ArgumentNullException("controllerContext");
            }

            HttpRequestMessage request   = controllerContext.Request;
            ODataPath          odataPath = request.ODataProperties().Path;
            IEnumerable <IODataRoutingConvention> routingConventions = request.ODataProperties().RoutingConventions;
            IHttpRouteData routeData = controllerContext.RouteData;

            if (odataPath == null || routingConventions == null || routeData.Values.ContainsKey(ODataRouteConstants.Action))
            {
                return(_innerSelector.SelectAction(controllerContext));
            }

            ILookup <string, HttpActionDescriptor> actionMap = GetActionMapping(controllerContext.ControllerDescriptor);

            foreach (IODataRoutingConvention routingConvention in routingConventions)
            {
                string actionName = routingConvention.SelectAction(odataPath, controllerContext, actionMap);
                if (actionName != null)
                {
                    routeData.Values[ODataRouteConstants.Action] = actionName;
                    IEnumerable <HttpActionDescriptor> candidateActions = actionMap[actionName];
                    int countMatchingActions = candidateActions.Count();
                    if (countMatchingActions == 1)
                    {
                        HttpActionDescriptor selectedCandidate = candidateActions.First();
                        return(selectedCandidate);
                    }
                    else if (countMatchingActions == 0)
                    {
                        return(null);
                    }

                    if (candidateActions.Any(candidateAction => ChangeSetEntityModelBinder.ActionHasChangeSetEntityParameter(candidateAction)))
                    {
                        IEnumerable <HttpActionDescriptor> orderedActions = candidateActions.OrderBy(DetermineActionOrder);
                        // TODO: IDEAL: Select the first action with all parameters present
                        // Since I can't figure out a good way to determine that, this implementation returns
                        // the changeSetEntity action iff the request URI has a ContentId reference;
                        // otherwise it returns the next available action.
                        foreach (var candidateAction in orderedActions)
                        {
                            if (ChangeSetEntityModelBinder.ActionHasChangeSetEntityParameter(candidateAction))
                            {
                                if (ContentIdHelper.RequestHasContentIdReference(controllerContext.Request))
                                {
                                    return(candidateAction);
                                }
                                // else continue;
                            }
                            else
                            {
                                return(candidateAction);
                            }
                        }
                    }
                    else
                    {
                        // If there aren't any ChangeSet entity parameters in any of the candidate actions, just use the regular
                        // HttpActionSelector's implementation. It does a good job selecting the best match based on parameters, but it doesn't support
                        // using an expanded set of actions.
                        return(_innerSelector.SelectAction(controllerContext));
                    }
                }
            }

            throw new HttpResponseException(request.CreateErrorResponse(HttpStatusCode.NotFound,
                                                                        string.Format("No matching resource found for {0}", controllerContext.Request.RequestUri)));
        }