我有一个自定义路由,它从无SQL数据库(MongoDB)中读取URL,并在应用程序启动时将它们添加到路由管道,这是非常标准的"
类似这样的东西(在我的startup.cs文件中):
app.UseMvc(routes =>
{
routes.MapRoute(
"default",
"{controller=Home}/{action=Index}/{id?}");
routes.Routes.Add(
new LandingPageRouter(routes, webrequest, memoryCache, Configuration));
// this custom routes adds URLs from database
}
问题是,如果我在应用程序启动后向数据库添加另一条路由,我基本上会得到404,因为路由系统不知道这条新路由,我认为我需要的是添加缺失运行时路由或(不太方便)从另一个Web应用程序(已在框架4.5上开发,显然它在不同的池上运行)重新启动应用程序池。
还有其他想法吗? 感谢。
答案 0 :(得分:3)
第一个问题是database
在您说:I add another route to the database
时的含义,您可以将路线保存在JSON,XML或INI文件中。
例如,如果可以将路由保留在JSON文件中,那么路由可以在运行时动态提供(this one)
as you can read in the ASP.NET Core Documentation
假设routes.json
是一个结构类似于以下内容的JSON文件,并且与Startup
位于同一文件夹中:
{
"route": "This is a route",
"another-route": "This is another route",
"default": "This is default!"
}
您可以通过以下方式配置Startup
课程:
请注意,此示例不使用MVC,而是使用单独的路由包,但我假设您可以将其转置为使用MVC。
public class Startup
{
public IConfiguration Configuration {get;set;}
public Startup(IHostingEnvironment env)
{
var configurationBuilder = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("routes.json", optional: false, reloadOnChange: true);
Configuration = configurationBuilder.Build();
}
public void ConfigureServices(IServiceCollection services)
{
services.AddRouting();
}
public void Configure(IApplicationBuilder app)
{
var routeBuilder = new RouteBuilder(app);
routeBuilder.MapGet("{route}", context =>
{
var routeMessage = Configuration.AsEnumerable()
.FirstOrDefault(r => r.Key == context.GetRouteValue("route")
.ToString())
.Value;
var defaultMessage = Configuration.AsEnumerable()
.FirstOrDefault(r => r.Key == "default")
.Value;
var response = (routeMessage != null) ? routeMessage : defaultMessage;
return context.Response.WriteAsync(response);
});
app.UseRouter(routeBuilder.Build());
}
}
此时,在应用程序运行时,您可以修改JSON文件,保存它,然后由于reloadOnChange: true
参数,框架会将新配置重新注入Configuration
属性。
重新加载的实现基于文件监视器,所以如果你想使用数据库 - 一个SQL Server,那么我认为你必须自己实现它。
A(完全没有完全提醒并仅提示完整性)解决方案可能是创建一个控制台应用程序,在文件中添加数据库更改,然后在应用程序配置中使用该文件。
祝你好运!
答案 1 :(得分:0)
在ASP.NET Core 3中,可以使用动态路由。在Startup.cs中添加:
app.UseEndpoints(endpoints =>
{
endpoints.MapDynamicControllerRoute<SearchValueTransformer>("{**url}");
});
并创建新的类SearchValueTransformer
class SearchValueTransformer : DynamicRouteValueTransformer
{
public override async ValueTask<RouteValueDictionary> TransformAsync(HttpContext httpContext, RouteValueDictionary values)
{
var url = values["url"] as string;
if (String.IsNullOrEmpty(url))
return values;
values["controller"] = "Controller";
values["action"] = "Action";
values["name"] = url;
return values;
}
}
在方法TransformAsync中,您也可以在MongoDB中搜索正确的Controller,Action和Name值。更多信息:https://weblogs.asp.net/ricardoperes/dynamic-routing-in-asp-net-core-3