手动将URL与.NET Core 3.0中已注册的终结点匹配

理查德·莫塞尔维尔德

对于我的应用程序,我想将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();

有没有办法获取所有注册的端点(模板)并与这些模板匹配?

Xueli Chen

在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在ASP.NET Core依赖项注入中手动注册控制器

如何在ASP.NET Core中手动注册FluentValidation验证器?

.NET Core 3:手动添加框架依赖项

.NET Core 3.x中的多个运行状况检查终结点

如何在 ASP.NET Core 中手动生成防伪令牌

如何在Net-Core 2.0中手动解析JSON字符串

如何将null传递给asp.net core 3.1中的终结点

如何解决请求与.Net Core Web Api中的多个终结点匹配的问题

如何为.Net Core手动设置WebHookReceiver?

手动创建IWebHostEnvironment asp.net core 3.1

为什么我们不再需要在更高版本的ASP.NET Core中手动验证模型?

ASP.NET Core中的Windows身份验证:手动登录与自动Intranet登录和可用组

如何在ASP.NET Core 2.0中配置登录尝试并由管理员手动解锁?

在ASP.NET Core中间件构造函数中混合依赖项注入和手动传递的参数

在Autofac中手动将Log4Net Logger实例注册到ILog的缺点是什么?

在VB.Net中手动处置类实例

在asp.net core 3中创建漂亮的url

在 Asp Net Core 3.1 中手动验证来自 OIDC 提供商的令牌,而没有“众所周知的”元数据

不一致的行为:手动返回BadRequest时,ASP.NET Core中的错误响应对象

Team City 构建 Dot Net Core 失败,但手动构建有效

如何使用 VS Code 在我的 .Net Core 项目中手动安装包/引用

如何手动解密ASP.NET Core身份验证Cookie?

.Net Core 依赖注入手动处理使用 implementationFactory Func 创建的对象

C#.net Core Fluentvalidation手动验证获取验证器类实例

即使我手动使用HttpContext.SignInAsync,.Net Core IsAuthenticated还是false

无法获取托管服务实例(手动启动托管服务.net core 3.1)

如何使用Asp.Net Core 2.2 / IdentityServer4 / SP.NET Core身份手动哈希密码

将typo3conf中的配置拆分为托管,手动和服务器特定的部分

MVC Core和EF Core在输入文本框中手动解析日期时间