Ejemplo n.º 1
0
 public override string SelectAction(
     AspNetCore.Routing.RouteContext routeContext,
     SelectControllerResult controllerResult,
     System.Collections.Generic.IEnumerable <AspNetCore.Mvc.Controllers.ControllerActionDescriptor> actionDescriptors)
 {
     return(null);
 }
Ejemplo n.º 2
0
 public override string SelectAction(
     RouteContext routeContext,
     SelectControllerResult controllerResult,
     IEnumerable <ControllerActionDescriptor> actionDescriptors)
 {
     return("GetName2");
 }
        public IEnumerable <ControllerActionDescriptor> SelectAction(RouteContext routeContext)
        {
            var odataPath = routeContext.HttpContext.ODataFeature().Path;

            if (odataPath.Segments.FirstOrDefault() is EntitySetSegment)
            {
                EdmCollectionType collectionType = odataPath.EdmType as EdmCollectionType;
                Type type = null;
                foreach (var assembly in AppDomain.CurrentDomain.GetAssemblies())
                {
                    if (assembly.GetType(collectionType != null ? collectionType.ElementType.Definition.ToString() : odataPath.EdmType?.ToString()) is Type t)
                    {
                        type = t;
                        break;
                    }
                }
                if (type == null)
                {
                    return(null);
                }

                // Get a IActionDescriptorCollectionProvider from the global service provider.
                IActionDescriptorCollectionProvider actionCollectionProvider = routeContext.HttpContext.RequestServices.GetRequiredService <IActionDescriptorCollectionProvider>();
                bool IsAutoGeneratedController = type.GetCustomAttribute <AutoGeneratedOdataControllerAttribute>() != null;
                IEnumerable <ControllerActionDescriptor> actionDescriptors = actionCollectionProvider
                                                                             .ActionDescriptors.Items.OfType <ControllerActionDescriptor>()
                                                                             .Where(c => IsAutoGeneratedController
                        ? c.ControllerTypeInfo.IsGenericType && c.ControllerTypeInfo.GenericTypeArguments.First() == type
                        : c.ControllerName == type.Name);

                if (odataPath.PathTemplate == "~/entityset/key/navigation")
                {
                    if (routeContext.HttpContext.Request.Method.ToUpperInvariant() == "GET")
                    {
                        NavigationPropertySegment navigationPathSegment = (NavigationPropertySegment)odataPath.Segments.Last();

                        routeContext.RouteData.Values["navigation"] = navigationPathSegment.NavigationProperty.Name;

                        KeySegment keyValueSegment = (KeySegment)odataPath.Segments[1];
                        routeContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Keys.First().Value;

                        return(actionDescriptors.Where(c => c.ActionName == "GetNavigation"));
                    }
                }
                SelectControllerResult          controllerResult   = new SelectControllerResult(type.Name, null);
                IList <IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault();
                foreach (NavigationSourceRoutingConvention nsRouting in routingConventions.OfType <NavigationSourceRoutingConvention>())
                {
                    string actionName = nsRouting.SelectAction(routeContext, controllerResult, actionDescriptors);
                    if (!String.IsNullOrEmpty(actionName))
                    {
                        return(actionDescriptors.Where(
                                   c => String.Equals(c.ActionName, actionName, StringComparison.OrdinalIgnoreCase)));
                    }
                }
            }
            return(null);
        }
        public override string SelectAction(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
        {
            string                requestMethod = routeContext.HttpContext.Request.Method;
            ODataPath             odataPath     = routeContext.HttpContext.ODataFeature().Path;
            TestControllerContext context       = new TestControllerContext(routeContext);
            IList <string>        actionLookup  = actionDescriptors.Select(a => a.ActionName).Distinct().ToList();

            return(SelectAction(requestMethod, odataPath, context, actionLookup));
        }
Ejemplo n.º 5
0
        public IEnumerable <ControllerActionDescriptor> SelectAction(RouteContext routeContext)
        {
            var odataPath = routeContext.HttpContext.ODataFeature().Path;

            if (!(odataPath.Segments.FirstOrDefault() is EntitySetSegment))
            {
                return(Enumerable.Empty <ControllerActionDescriptor>());
            }

            // Get a IActionDescriptorCollectionProvider from the global service provider.
            IActionDescriptorCollectionProvider actionCollectionProvider =
                routeContext.HttpContext.RequestServices.GetRequiredService <IActionDescriptorCollectionProvider>();

            IEnumerable <ControllerActionDescriptor> actionDescriptors = actionCollectionProvider
                                                                         .ActionDescriptors.Items.OfType <ControllerActionDescriptor>()
                                                                         .Where(c => c.ControllerName == ControllerName);

            if (odataPath.PathTemplate == "~/entityset/key/navigation")
            {
                if (routeContext.HttpContext.Request.Method.ToUpperInvariant() == "GET")
                {
                    NavigationPropertySegment navigationPathSegment = (NavigationPropertySegment)odataPath.Segments.Last();

                    routeContext.RouteData.Values["navigation"] = navigationPathSegment.NavigationProperty.Name;

                    KeySegment keyValueSegment = (KeySegment)odataPath.Segments[1];
                    routeContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Keys.First().Value;

                    return(actionDescriptors.Where(c => c.ActionName == "GetNavigation").ToList());
                }
            }

            SelectControllerResult          controllerResult   = new SelectControllerResult(ControllerName, null);
            IList <IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault();

            foreach (NavigationSourceRoutingConvention nsRouting in routingConventions.OfType <NavigationSourceRoutingConvention>())
            {
                string actionName = nsRouting.SelectAction(routeContext, controllerResult, actionDescriptors);
                if (!string.IsNullOrEmpty(actionName))
                {
                    return(actionDescriptors.Where(
                               c => string.Equals(c.ActionName, actionName, StringComparison.OrdinalIgnoreCase)).ToList());
                }
            }

            return(null);
        }
        /// <inheritdoc/>
        /// <remarks>This signature uses types that are AspNetCore-specific.</remarks>
        public IEnumerable <ControllerActionDescriptor> SelectAction(RouteContext routeContext)
        {
            if (routeContext == null)
            {
                throw new ArgumentNullException("routeContext");
            }

            Microsoft.AspNet.OData.Routing.ODataPath odataPath = routeContext.HttpContext.ODataFeature().Path;
            if (odataPath == null)
            {
                throw new ArgumentNullException("odataPath");
            }

            HttpRequest request = routeContext.HttpContext.Request;

            SelectControllerResult controllerResult = SelectControllerImpl(odataPath);

            if (controllerResult != null)
            {
                // Get a IActionDescriptorCollectionProvider from the global service provider.
                IActionDescriptorCollectionProvider actionCollectionProvider =
                    routeContext.HttpContext.RequestServices.GetRequiredService <IActionDescriptorCollectionProvider>();
                Contract.Assert(actionCollectionProvider != null);

                IEnumerable <ControllerActionDescriptor> actionDescriptors = actionCollectionProvider
                                                                             .ActionDescriptors.Items.OfType <ControllerActionDescriptor>()
                                                                             .Where(c => c.AttributeRouteInfo != null && c.AttributeRouteInfo.Template == controllerResult.ControllerName);

                if (actionDescriptors != null)
                {
                    string actionName = SelectAction(routeContext, controllerResult, actionDescriptors);
                    if (!String.IsNullOrEmpty(actionName))
                    {
                        return(actionDescriptors.Where(
                                   c => String.Equals(c.ActionName, actionName, StringComparison.OrdinalIgnoreCase)));
                    }
                }
            }

            return(null);
        }
Ejemplo n.º 7
0
        internal static string SelectAction(NavigationSourceRoutingConvention convention, ODataPath odataPath, HttpRequest request, IEnumerable <ControllerActionDescriptor> actionMap, string controllerName = "ControllerName")
        {
            // COnstruct parameters.
            RouteContext routeContext = new RouteContext(request.HttpContext);

            routeContext.HttpContext.ODataFeature().Path = odataPath;

            SelectControllerResult controllerResult = new SelectControllerResult(controllerName, null);

            // Select the action.
            string result = convention.SelectAction(routeContext, controllerResult, actionMap);

            // Copy route data to the context. In the real pipeline, this occurs in
            // RouterMiddleware.cs after the request has been routed.
            request.HttpContext.Features[typeof(IRoutingFeature)] = new RoutingFeature()
            {
                RouteData = routeContext.RouteData,
            };

            return(result);
        }
Ejemplo n.º 8
0
        /// <summary>
        /// Initializes a new instance of the WebApiControllerContext class.
        /// </summary>
        /// <param name="routeContext">The inner context.</param>
        /// <param name="controllerResult">The selected controller result.</param>
        public WebApiControllerContext(RouteContext routeContext, SelectControllerResult controllerResult)
        {
            if (routeContext == null)
            {
                throw Error.ArgumentNull("routeContext");
            }

            if (controllerResult == null)
            {
                throw Error.ArgumentNull("controllerResult");
            }

            this.innerContext     = routeContext;
            this.ControllerResult = controllerResult;

            HttpRequest request = routeContext.HttpContext.Request;

            if (request != null)
            {
                this.Request = new WebApiRequestMessage(request);
            }
        }
Ejemplo n.º 9
0
        public IEnumerable <ControllerActionDescriptor> SelectAction(RouteContext routeContext)
        {
            var odataPath = routeContext.HttpContext.ODataFeature().Path;

            // check whether an entity set was requested
            if (!(odataPath.Segments.FirstOrDefault() is EntitySetSegment entitySetSegment) || !(entitySetSegment.EntitySet.Type is IEdmCollectionType edmCollectionType))
            {
                return(null);
            }

            // ask model provider whether requested entity set is a Interior
            var edmModel         = routeContext.HttpContext.Request.GetModel();
            var edmModelProvider = routeContext.HttpContext.RequestServices.GetRequiredService <EdmModelBuilder>();

            if (edmModelProvider.IsInterior(edmModel, edmCollectionType.ElementType.Definition))
            {
                IActionDescriptorCollectionProvider actionCollectionProvider =
                    routeContext.HttpContext.RequestServices.GetRequiredService <IActionDescriptorCollectionProvider>();

                IEnumerable <ControllerActionDescriptor> actionDescriptors = actionCollectionProvider
                                                                             .ActionDescriptors.Items.OfType <ControllerActionDescriptor>()
                                                                             .Where(c => c.ControllerName == ControllerName);

                SelectControllerResult          controllerResult   = new SelectControllerResult(ControllerName, null);
                IList <IODataRoutingConvention> routingConventions = ODataRoutingConventions.CreateDefault();
                foreach (NavigationSourceRoutingConvention nsRouting in routingConventions.OfType <NavigationSourceRoutingConvention>())
                {
                    string actionName = nsRouting.SelectAction(routeContext, controllerResult, actionDescriptors);
                    if (!String.IsNullOrEmpty(actionName))
                    {
                        return(actionDescriptors.Where(
                                   c => String.Equals(c.ActionName, actionName, StringComparison.OrdinalIgnoreCase)));
                    }
                }
            }

            return(null);
        }
        public override string SelectAction(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
        {
            var odataPath = routeContext.HttpContext.ODataFeature().Path;

            IActionDescriptorCollectionProvider actionCollectionProvider =
                routeContext.HttpContext.RequestServices.GetRequiredService <IActionDescriptorCollectionProvider>();

            if (odataPath.PathTemplate == "~/entityset/key/navigation")
            {
                if (routeContext.HttpContext.Request.Method.ToUpperInvariant() == "GET")
                {
                    NavigationPropertySegment navigationPathSegment = (NavigationPropertySegment)odataPath.Segments.Last();

                    routeContext.RouteData.Values["navigation"] = navigationPathSegment.NavigationProperty.Name;

                    KeySegment keyValueSegment = (KeySegment)odataPath.Segments[1];
                    routeContext.RouteData.Values[ODataRouteConstants.Key] = keyValueSegment.Keys.First().Value;

                    return("GetNavigation");
                }
            }
            return(null);
        }
 public override string SelectAction(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
 {
     string result = base.SelectAction(routeContext, controllerResult, actionDescriptors);
     IDictionary <string, object> conventionStore = routeContext.HttpContext.Request.ODataFeature().RoutingConventionsStore;
     IDictionary <string, object> routeData       = routeContext.RouteData.Values;
        private string SelectActionImpl(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
        {
            Microsoft.AspNet.OData.Routing.ODataPath odataPath = routeContext.HttpContext.ODataFeature().Path;
            HttpRequest request = routeContext.HttpContext.Request;

            if (odataPath.PathTemplate == "~/entityset")
            {
                EntitySetSegment  entitySetSegment = (EntitySetSegment)odataPath.Segments[0];
                IEdmEntitySetBase entitySet        = entitySetSegment.EntitySet;

                if (HttpMethods.IsGet(request.Method))
                {
                    // e.g. Try GetCustomers first, then fall back to Get action name
                    return(actionDescriptors.FindMatchingAction(
                               "Get" + entitySet.Name,
                               "Get"));
                }
                else if (HttpMethods.IsPost(request.Method))
                {
                    // e.g. Try PostCustomer first, then fall back to Post action name
                    return(actionDescriptors.FindMatchingAction(
                               "Post" + entitySet.EntityType().Name,
                               "Post"));
                }
            }
            else if (odataPath.PathTemplate == "~/entityset/key" ||
                     odataPath.PathTemplate == "~/entityset/key/cast")
            {
                string httpMethodName;

                if (HttpMethods.IsGet(request.Method))
                {
                    httpMethodName = "Get";
                }
                else if (HttpMethods.IsPut(request.Method))
                {
                    httpMethodName = "Put";
                }
                else if (HttpMethods.IsPatch(request.Method))
                {
                    httpMethodName = "Patch";
                }
                else if (HttpMethods.IsDelete(request.Method))
                {
                    httpMethodName = "Delete";
                }
                else
                {
                    return(null);
                }

                Contract.Assert(httpMethodName != null);

                IEdmEntityType entityType = (IEdmEntityType)odataPath.EdmType;

                // e.g. Try GetCustomer first, then fallback on Get action name
                string actionName = actionDescriptors.FindMatchingAction(
                    httpMethodName + entityType.Name,
                    httpMethodName);

                if (actionName != null)
                {
                    KeySegment keySegment = (KeySegment)odataPath.Segments[1];
                    // TODO: Add key/value to RouteData
                    return(actionName);
                }
            }
            else if (odataPath.PathTemplate == "~/entityset/$count" &&
                     HttpMethods.IsGet(request.Method))
            {
                EntitySetSegment  entitySetSegment = (EntitySetSegment)odataPath.Segments[0];
                IEdmEntitySetBase entitySet        = entitySetSegment.EntitySet;

                // e.g. Try GetCustomers first, then fall back to Get action name
                return(actionDescriptors.FindMatchingAction(
                           "Get" + entitySet.Name,
                           "Get"));
            }
            else if (odataPath.PathTemplate == "~/entityset/cast")
            {
                EntitySetSegment   entitySetSegment = (EntitySetSegment)odataPath.Segments[0];
                IEdmEntitySetBase  entitySet        = entitySetSegment.EntitySet;
                IEdmCollectionType collectionType   = (IEdmCollectionType)odataPath.EdmType;
                IEdmEntityType     entityType       = (IEdmEntityType)collectionType.ElementType.Definition;

                if (HttpMethods.IsGet(request.Method))
                {
                    // e.g. Try GetCustomersFromSpecialCustomer first, then fall back to GetFromSpecialCustomer
                    return(actionDescriptors.FindMatchingAction(
                               "Get" + entitySet.Name + "From" + entityType.Name,
                               "GetFrom" + entityType.Name));
                }
                else if (HttpMethods.IsPost(request.Method))
                {
                    // e.g. Try PostCustomerFromSpecialCustomer first, then fall back to PostFromSpecialCustomer
                    return(actionDescriptors.FindMatchingAction(
                               "Post" + entitySet.EntityType().Name + "From" + entityType.Name,
                               "PostFrom" + entityType.Name));
                }
            }
            else if (odataPath.PathTemplate == "~/entityset/cast/$count" &&
                     HttpMethods.IsGet(request.Method))
            {
                EntitySetSegment   entitySetSegment = (EntitySetSegment)odataPath.Segments[0];
                IEdmEntitySetBase  entitySet        = entitySetSegment.EntitySet;
                IEdmCollectionType collectionType   = (IEdmCollectionType)odataPath.Segments[1].EdmType;
                IEdmEntityType     entityType       = (IEdmEntityType)collectionType.ElementType.Definition;

                // e.g. Try GetCustomersFromSpecialCustomer first, then fall back to GetFromSpecialCustomer
                return(actionDescriptors.FindMatchingAction(
                           "Get" + entitySet.Name + "From" + entityType.Name,
                           "GetFrom" + entityType.Name));
            }

            return(null);
        }
 public string SelectAction(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
 {
     return(SelectActionImpl(routeContext, controllerResult, actionDescriptors));
 }
        private string SelectActionImpl(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
        {
            Microsoft.AspNet.OData.Routing.ODataPath odataPath = routeContext.HttpContext.ODataFeature().Path;
            HttpRequest request = routeContext.HttpContext.Request;

            if (odataPath.PathTemplate.EndsWith("$ref"))
            {
                if (HttpMethods.IsDelete(request.Method))
                {
                    return(actionDescriptors.FindMatchingAction("DeleteRef"));
                }
                else if (HttpMethods.IsPost("$ref") || HttpMethods.IsPut("$ref"))
                {
                    return(actionDescriptors.FindMatchingAction("CreateRef"));
                }
            }
            else if (odataPath.PathTemplate.EndsWith("$count"))
            {
                // $count is only supported for GET requests
                if (HttpMethods.IsGet(request.Method))
                {
                    return(actionDescriptors.FindMatchingAction("Get"));
                }
            }
            else if (HttpMethods.IsGet(request.Method))
            {
                // A single Get method will handle all Get requests.
                // It should contain the logic for traversing potenially nested path
                // and extract the relevant keys and navigation properties
                return(actionDescriptors.FindMatchingAction("Get"));
            }
            // TODO: we currently do not support nested paths for Create/Update/Delete requests
            // TODO: verify whether we support casts
            else if (HttpMethods.IsPost(request.Method))
            {
                if (odataPath.PathTemplate == "~/entityset" ||
                    odataPath.PathTemplate == "~/entityset/cast")
                {
                    return(actionDescriptors.FindMatchingAction("Post"));
                }
            }
            else if (odataPath.PathTemplate == "~/entityset/key" ||
                     odataPath.PathTemplate == "~/entityset/key/cast" ||
                     odataPath.PathTemplate == "~/singleton" ||
                     odataPath.PathTemplate == "~/singleton/cast")
            {
                if (HttpMethods.IsPut(request.Method))
                {
                    return(actionDescriptors.FindMatchingAction("Put"));
                }
                else if (HttpMethods.IsPatch(request.Method))
                {
                    // TODO: we should filter support for navigation properties / nested paths
                    return(actionDescriptors.FindMatchingAction("Patch"));
                }
                else if (HttpMethods.IsDelete(request.Method))
                {
                    // TODO: we should filter support for navigation properties / nested paths
                    return(actionDescriptors.FindMatchingAction("Delete"));
                }
            }

            return(null);
        }
Ejemplo n.º 15
0
 public override string SelectAction(RouteContext routeContext, SelectControllerResult controllerResult, IEnumerable <ControllerActionDescriptor> actionDescriptors)
 {
     throw new NotImplementedException();
 }