如何从 url 中找到端点?
How can I find an endpoint from a url?
我正在使用端点路由,我想为给定的 url 和可能的请求方法找到正确的端点对象。如果我至少可以找到基于 url 的端点,那将很有帮助。本质上,我希望实现以下方法。
public Endpoint GetEndpoint(HttpContext httpContext, string url, string requestMethod)
{
// I can get all of the endpoints
var endpointDataSource = httpContext.RequestServices.GetService<EndpointDataSource>();
var endpoints = endpointDataSource.Endpoints;
// But I'm not sure what to do here
}
我想也许我可以使用 DefaultLinkParser.cs 但到目前为止我还没有想出来。
我不确定是否有更好的方法,但这似乎有效
public Endpoint GetEndpoint(HttpContext httpContext, string url, string requestMethod)
{
var routeValues = new RouteValueDictionary();
var endpointDataSource = httpContext.RequestServices.GetService<EndpointDataSource>();
var endpoints = endpointDataSource.Endpoints.OfType<RouteEndpoint>();
foreach (var endpoint in endpoints)
{
var templateMatcher = new TemplateMatcher(TemplateParser.Parse(endpoint.RoutePattern.RawText), new RouteValueDictionary());
if (!templateMatcher.TryMatch(url, routeValues)) continue;
var httpMethodAttribute = endpoint.Metadata.GetMetadata<HttpMethodAttribute>();
if (httpMethodAttribute != null && !httpMethodAttribute.HttpMethods.Any(x => x.Equals(requestMethod, StringComparison.OrdinalIgnoreCase))) continue;
return endpoint;
}
return null;
}
我从中得到了一些想法
我正在使用端点路由,我想为给定的 url 和可能的请求方法找到正确的端点对象。如果我至少可以找到基于 url 的端点,那将很有帮助。本质上,我希望实现以下方法。
public Endpoint GetEndpoint(HttpContext httpContext, string url, string requestMethod)
{
// I can get all of the endpoints
var endpointDataSource = httpContext.RequestServices.GetService<EndpointDataSource>();
var endpoints = endpointDataSource.Endpoints;
// But I'm not sure what to do here
}
我想也许我可以使用 DefaultLinkParser.cs 但到目前为止我还没有想出来。
我不确定是否有更好的方法,但这似乎有效
public Endpoint GetEndpoint(HttpContext httpContext, string url, string requestMethod)
{
var routeValues = new RouteValueDictionary();
var endpointDataSource = httpContext.RequestServices.GetService<EndpointDataSource>();
var endpoints = endpointDataSource.Endpoints.OfType<RouteEndpoint>();
foreach (var endpoint in endpoints)
{
var templateMatcher = new TemplateMatcher(TemplateParser.Parse(endpoint.RoutePattern.RawText), new RouteValueDictionary());
if (!templateMatcher.TryMatch(url, routeValues)) continue;
var httpMethodAttribute = endpoint.Metadata.GetMetadata<HttpMethodAttribute>();
if (httpMethodAttribute != null && !httpMethodAttribute.HttpMethods.Any(x => x.Equals(requestMethod, StringComparison.OrdinalIgnoreCase))) continue;
return endpoint;
}
return null;
}
我从中得到了一些想法