private RouteEndpoint CreateEndpoint( ActionDescriptor action, IDictionary <string, string> actionRouteValues, string routeName, string patternRawText, IEnumerable <RoutePatternPathSegment> segments, object nonInlineDefaults, int order, RouteValueDictionary dataTokens, bool suppressLinkGeneration, bool suppressPathMatching, List <Action <EndpointModel> > conventions) { RequestDelegate requestDelegate = (context) => { var routeData = context.GetRouteData(); var actionContext = new ActionContext(context, routeData, action); var invoker = _invokerFactory.CreateInvoker(actionContext); return(invoker.InvokeAsync()); }; var defaults = new RouteValueDictionary(nonInlineDefaults); EnsureRequiredValuesInDefaults(actionRouteValues, defaults, segments); var model = new RouteEndpointModel(requestDelegate, RoutePatternFactory.Pattern(patternRawText, defaults, parameterPolicies: null, segments), order); AddEndpointMetadata( model.Metadata, action, routeName, new RouteValueDictionary(actionRouteValues), dataTokens, suppressLinkGeneration, suppressPathMatching); model.DisplayName = action.DisplayName; // REVIEW: When should conventions be run // Metadata should have lower precedence that data source metadata if (conventions != null) { foreach (var convention in conventions) { convention(model); } } return((RouteEndpoint)model.Build()); }
private RouteEndpoint CreateEndpoint( ActionDescriptor action, RoutePattern routePattern, string routeName, int order, RouteValueDictionary dataTokens, bool suppressLinkGeneration, bool suppressPathMatching, List <Action <EndpointBuilder> > conventions) { RequestDelegate requestDelegate = (context) => { var routeData = context.GetRouteData(); var actionContext = new ActionContext(context, routeData, action); var invoker = _invokerFactory.CreateInvoker(actionContext); return(invoker.InvokeAsync()); }; var endpointBuilder = new RouteEndpointBuilder(requestDelegate, routePattern, order); AddEndpointMetadata( endpointBuilder.Metadata, action, routeName, dataTokens, suppressLinkGeneration, suppressPathMatching); endpointBuilder.DisplayName = action.DisplayName; // REVIEW: When should conventions be run // Metadata should have lower precedence that data source metadata if (conventions != null) { foreach (var convention in conventions) { convention(endpointBuilder); } } return((RouteEndpoint)endpointBuilder.Build()); }
private RouteEndpoint CreateEndpoint( ActionDescriptor action, RoutePattern routePattern, string routeName, int order, RouteValueDictionary dataTokens, bool suppressLinkGeneration, bool suppressPathMatching, IReadOnlyList <Action <EndpointBuilder> > conventions) { RequestDelegate requestDelegate = (context) => { var routeData = context.GetRouteData(); var actionContext = new ActionContext(context, routeData, action); var invoker = _invokerFactory.CreateInvoker(actionContext); return(invoker.InvokeAsync()); }; var builder = new RouteEndpointBuilder(requestDelegate, routePattern, order) { DisplayName = action.DisplayName, }; // Add action metadata first so it has a low precedence if (action.EndpointMetadata != null) { foreach (var d in action.EndpointMetadata) { builder.Metadata.Add(d); } } builder.Metadata.Add(action); if (dataTokens != null) { builder.Metadata.Add(new DataTokensMetadata(dataTokens)); } builder.Metadata.Add(new RouteNameMetadata(routeName)); // Add filter descriptors to endpoint metadata if (action.FilterDescriptors != null && action.FilterDescriptors.Count > 0) { foreach (var filter in action.FilterDescriptors.OrderBy(f => f, FilterDescriptorOrderComparer.Comparer).Select(f => f.Filter)) { builder.Metadata.Add(filter); } } if (action.ActionConstraints != null && action.ActionConstraints.Count > 0) { // We explicitly convert a few types of action constraints into MatcherPolicy+Metadata // to better integrate with the DFA matcher. // // Other IActionConstraint data will trigger a back-compat path that can execute // action constraints. foreach (var actionConstraint in action.ActionConstraints) { if (actionConstraint is HttpMethodActionConstraint httpMethodActionConstraint && !builder.Metadata.OfType <HttpMethodMetadata>().Any()) { builder.Metadata.Add(new HttpMethodMetadata(httpMethodActionConstraint.HttpMethods)); } else if (actionConstraint is ConsumesAttribute consumesAttribute && !builder.Metadata.OfType <ConsumesMetadata>().Any()) { builder.Metadata.Add(new ConsumesMetadata(consumesAttribute.ContentTypes.ToArray())); }