【问题标题】:Is it possible to change MVC routes after startup?启动后是否可以更改 MVC 路由?
【发布时间】:2018-09-12 04:36:49
【问题描述】:

我有一个 .NET Core 2.1 Web API,它在启动时通过 IRouteBuilder 的 MapRoute 方法注册自定义路由。这发生在启动的 Configure() 方法中。

有时这些路由需要更改,我想避免为了添加或删除自定义路由而必须重新启动 web api。网站运行时是否可以修改路由表?

【问题讨论】:

标签: asp.net-core-webapi


【解决方案1】:

对于动态自定义路由器,您可以尝试IRouter

这是一个简单的演示,用于在运行时从appsettings.json 文件更改路由器。

  1. appsettings.json

    {
     "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
    },
     "AllowedHosts": "*",
     "Router": {
    "Controller": "Home",
    "Action": "Contact"
     }
    }   
    
  2. 自定义路由器RouterFromAppSettings

    public class RouterFromAppSettings : IRouter
    {
    private readonly IRouter _defaulRouter;
    private readonly IConfiguration _config;
    public RouterFromAppSettings(IRouter defaulRouter
        , IConfiguration config)
    {
        _defaulRouter = defaulRouter;
        _config = config;
    }
    public async Task RouteAsync(RouteContext context)
    {
        var controller = _config.GetSection("Router").GetValue<string>("Controller");
        var action = _config.GetSection("Router").GetValue<string>("Action");
        context.RouteData.Values["controller"] = controller;
        context.RouteData.Values["action"] = action;
        await _defaulRouter.RouteAsync(context);
    }
    public VirtualPathData GetVirtualPath(VirtualPathContext context)
    {
        return _defaulRouter.GetVirtualPath(context);
    }
    }
    
  3. 注册自定义路由

            app.UseMvc(routes =>
        {
            routes.Routes.Insert(0, new RouterFromAppSettings(routes.DefaultHandler,Configuration));
    
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });
    
  4. 启动应用程序后,您可以更改appsettings Router 节点以重定向到不同的操作。

【讨论】:

  • 这对涛真的很有帮助。谢谢你。我很好奇它是如何工作的,因为你实际上并没有将路由处理程序设置为任何东西(它是空的)。您填充路由数据值,以某种方式强制路由到路由数据中指定的控制器和操作。文档表明,如果处理程序设置为非空处理程序,它将仅用于路由。 docs.microsoft.com/en-us/aspnet/core/fundamentals/…
  • @Geekn 我通过routes.Routes.Insert(0, new RouterFromAppSettings(routes.DefaultHandler,Configuration));Startup 中传递了默认路由器处理程序
  • 不,我明白了,我会接受答案(谢谢)。它完美地工作。我们所做的只是添加路由数据,这看起来就像我们在 MapRoute 时所做的那样。我只是想知道为什么默认处理程序总是使用我添加到路由数据的任何控制器,因为如果这有意义的话,URL 不匹配它。
  • 您还知道是否已经有 .NET 核心代码将采用 URL 路径并告诉我它是否与 URL 模板匹配。我认为内置路由器必须通过标记 URL 并查看它是否与路由表中的任何路由模板匹配来做到这一点。
  • @Geekn 你可以考虑检查Routing 源代码,看看它是如何将 url 映射到操作的。
猜你喜欢
  • 2022-11-18
  • 2015-12-10
  • 1970-01-01
  • 2011-02-01
  • 2018-11-23
  • 2016-01-14
  • 2017-01-26
  • 1970-01-01
  • 2017-06-12
相关资源
最近更新 更多