Таким образом, код типа var router = RouteData.Routers.First(); //получить маршрутизатор верхнего уровня больше не будет работать правильно, так как Routers не содержит ничего значимого.
Я вижу несколько примеры использования конечных точек для текущего HttpContext, например здесь, но ни одного для пользовательского.
Я также видел упоминание о IActionDescriptorCollectionProvider , но это не позволит мне легко фильтровать определенный URL-адрес.
Пока я внедряю HttpContextFactory, но передаю ему IEndpointFeature из текущего контекста:
Код: Выделить всё
private readonly IHttpContextFactory _HttpContextFactory;
public MyController(IHttpContextFact httpContextFactory)
{
_HttpContextFactory = httpContextFactory;
}
public async Task GetRouteDataForUrl([FromQuery(Name = "url")] string url)
{
var uri = new Uri(url);
// this is probably wrong -- it supplies the _original_ context's endpoint feature
var featureCollection = this.HttpContext.Features;
var httpContext = _HttpContextFactory.Create(featureCollection);
httpContext.Request.Path = uri.PathAndQuery;
var feature = httpContext.Features.Get();
var endpoint = httpContext.Features.Get()?.Endpoint; // see https://github.com/aspnet/AspNetCore/issues/5135#issuecomment-461547335
return Ok(endpoint.Metadata.OfType());
}
Для этого не существует общедоступного конструктора EndpointFeature, поэтому мне, вероятно, не придется передавать свой собственный. Приведенный выше код берет IEndpointFeature из исходного («неправильного») контекста http и в результате дает мне конечную точку для контроллера GetRouteDataForUrl, а не для контроллера. Я передаю URL.
Подробнее здесь: https://stackoverflow.com/questions/595 ... ttpcontext
Мобильная версия