public IEnumerable <Endpoint> FindEndpoints(RouteValuesAddress address) { if (address == null) { throw new ArgumentNullException(nameof(address)); } // Run custom tenant schemes. foreach (var scheme in _schemes) { var endpoints = scheme.FindEndpoints(address); if (endpoints.Any()) { return(endpoints); } } if (!_defaultSchemeInitialized) { lock (this) { // Try once to get and cache the default scheme but not me. _defaultScheme = _httpContextAccessor.HttpContext?.RequestServices .GetServices <IEndpointAddressScheme <RouteValuesAddress> >() .Where(scheme => scheme.GetType() != GetType()) .LastOrDefault(); _defaultSchemeInitialized = true; } } // Fallback to the default 'RouteValuesAddress' scheme. return(_defaultScheme?.FindEndpoints(address) ?? Enumerable.Empty <Endpoint>()); }
public MetadataController( IMetadataProvider metadataProvider, IEndpointAddressScheme <RouteValuesAddress> endpointAddress) { _metadataProvider = metadataProvider; _endpointAddress = endpointAddress; }
private static void PrepForReExecute(HttpContext context, UploadErrorsModel uploadErrorsModel) { // Clear request context.Request.Method = "POST"; context.Request.Body = Stream.Null; if (uploadErrorsModel.Errors?.Length > 0) { Dictionary <string, StringValues> query = new Dictionary <string, StringValues> { [nameof(uploadErrorsModel.Errors)] = uploadErrorsModel.Errors }; context.Request.QueryString = QueryString.Create(query); } else { context.Request.QueryString = new QueryString(); } // Reset the request in its most basic form context.Request.ContentType = "text/plain"; context.Request.PathBase = "/"; context.Request.Path = "/"; // Set endpoint and associated routing data const string continuationEndpoint = "AfterUploadCompletionFrame"; IEndpointAddressScheme <string> svc = context.RequestServices.GetRequiredService <IEndpointAddressScheme <string> >(); IEnumerable <Endpoint> endpoints = svc.FindEndpoints(continuationEndpoint); bool hasSetEndpoint = false; foreach (Endpoint endpoint in endpoints) { if (hasSetEndpoint) { throw new InvalidOperationException($"Multiple endpoints {continuationEndpoint}"); } // Prepare routing values MVC uses for view lookups ControllerActionDescriptor?actionDescriptor = endpoint.Metadata.GetMetadata <ControllerActionDescriptor>(); if (actionDescriptor != null) { RouteData routeData = context.GetRouteData(); foreach (KeyValuePair <string, string?> routeValue in actionDescriptor.RouteValues) { routeData.Values[routeValue.Key] = routeValue.Value; } } // Set to endpoint to use later context.SetEndpoint(endpoint); hasSetEndpoint = true; } if (!hasSetEndpoint) { throw new InvalidOperationException($"Unable to find continuation endpoint {continuationEndpoint}"); } }
public SmartRouteValuesAddressScheme(IEndpointAddressScheme <RouteValuesAddress> inner, IHttpContextAccessor httpContextAccessor) { _inner = inner; _httpContextAccessor = httpContextAccessor; }
public void OnGet([FromServices] IEndpointAddressScheme <RouteValuesAddress> addressingScheme) { }