对于我的应用程序,我想将URL与所有已注册的路由进行匹配,以查看是否存在匹配项。
当有匹配项时,我想从匹配项中提取路由值。
我在ASP.NET Core 2.1中使用了此功能,但似乎无法以.NET Core 3中的方式检索路由。
有效的ASP.NET Core 2.1示例:
string url = "https://localhost/Area/Controller/Action";
// Try to match against the default route (but can be any other route)
Route defaultRoute = this._httpContextAccessor.HttpContext.GetRouteData().Routers.OfType<Route>().FirstOrDefault(p => p.Name == "Default");
RouteTemplate defaultTemplate = defaultRoute.ParsedTemplate;
var defaultMatcher = new TemplateMatcher(defaultTemplate, defaultRoute.Defaults);
var defaultRouteValues = new RouteValueDictionary();
string defaultLocalPath = new Uri(url).LocalPath;
if (!defaultMatcher.TryMatch(defaultLocalPath, defaultRouteValues))
{
return null;
}
string area = defaultRouteValues["area"]?.ToString();
string controller = defaultRouteValues["controller"]?.ToString();
string actiondefaultRouteValues["action"]?.ToString();
有没有办法获取所有注册的端点(模板)并与这些模板匹配?
在ASP.NET Core 2.1和更低版本中,路由是通过实现将IRouter
传入的URL映射到处理程序的接口来处理的。通常,您将不依赖于直接实现接口,而是依赖MvcMiddleware
添加到中间件管道末端的实现。
在ASP.NET Core 3.0中,我们使用端点路由,因此路由步骤与端点的调用是分开的。实际上,这意味着我们有两个中间件:
EndpointRoutingMiddleware
它执行实际的路由,即计算将为给定的请求URL路径调用哪个端点。
EndpointMiddleware
调用端点。
因此,您可以尝试以下方法将url与所有已注册的路由进行匹配,以查看asp.net core 3.0中是否存在匹配项。
public class TestController : Controller
{
private readonly EndpointDataSource _endpointDataSource;
public TestController ( EndpointDataSource endpointDataSource)
{
_endpointDataSource = endpointDataSource;
}
public IActionResult Index()
{
string url = "https://localhost/User/Account/Logout";
// Return a collection of Microsoft.AspNetCore.Http.Endpoint instances.
var routeEndpoints = _endpointDataSource?.Endpoints.Cast<RouteEndpoint>();
var routeValues = new RouteValueDictionary();
string LocalPath = new Uri(url).LocalPath;
//To get the matchedEndpoint of the provide url
var matchedEndpoint = routeEndpoints.Where(e => new TemplateMatcher(
TemplateParser.Parse(e.RoutePattern.RawText),
new RouteValueDictionary())
.TryMatch(LocalPath, routeValues))
.OrderBy(c => c.Order)
.FirstOrDefault();
if (matchedEndpoint != null)
{
string area = routeValues["area"]?.ToString();
string controller = routeValues["controller"]?.ToString();
string action = routeValues["action"]?.ToString();
}
return View();
}
}
您可以参考此博客,以获取有关ASP.NET Core 3.0中端点路由的更多详细信息。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句