启动后是否可以更改MVC路由?

时间:2018-09-10 17:59:02

标签: asp.net-core-webapi

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

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

1 个答案:

答案 0 :(得分:0)

对于动态定制路由器,您可以尝试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节点以重定向到其他操作。