【发布时间】:2018-09-12 04:36:49
【问题描述】:
我有一个 .NET Core 2.1 Web API,它在启动时通过 IRouteBuilder 的 MapRoute 方法注册自定义路由。这发生在启动的 Configure() 方法中。
有时这些路由需要更改,我想避免为了添加或删除自定义路由而必须重新启动 web api。网站运行时是否可以修改路由表?
【问题讨论】:
-
什么是
ConfigreRoute?您将如何配置动态路由?
我有一个 .NET Core 2.1 Web API,它在启动时通过 IRouteBuilder 的 MapRoute 方法注册自定义路由。这发生在启动的 Configure() 方法中。
有时这些路由需要更改,我想避免为了添加或删除自定义路由而必须重新启动 web api。网站运行时是否可以修改路由表?
【问题讨论】:
ConfigreRoute?您将如何配置动态路由?
对于动态自定义路由器,您可以尝试IRouter。
这是一个简单的演示,用于在运行时从appsettings.json 文件更改路由器。
appsettings.json
{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"Router": {
"Controller": "Home",
"Action": "Contact"
}
}
自定义路由器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);
}
}
注册自定义路由
app.UseMvc(routes =>
{
routes.Routes.Insert(0, new RouterFromAppSettings(routes.DefaultHandler,Configuration));
routes.MapRoute(
name: "default",
template: "{controller=Home}/{action=Index}/{id?}");
});
启动应用程序后,您可以更改appsettings Router 节点以重定向到不同的操作。
【讨论】:
routes.Routes.Insert(0, new RouterFromAppSettings(routes.DefaultHandler,Configuration)); 在Startup 中传递了默认路由器处理程序