在dotnetcore中重新加载运行时的路由

时间:2016-09-13 00:32:32

标签: c# asp.net-core asp.net-core-mvc

我有一个自定义路由,它从无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上开发,显然它在不同的池上运行)重新启动应用程序池。

还有其他想法吗? 感谢。

2 个答案:

答案 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