2016-09-13 3 views
1

У меня есть пользовательский маршрут, который считывает адреса из базы данных не-SQL (MongoDB) и добавить их в маршрут трубопровода в момент, когда приложение запускается, который является «довольно стандартным»Перезагрузить маршруты на время работы в dotnetcore

что-то вроде этого (в моем файле 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, так как система маршрутизации не знает этот новый маршрут, я думаю, что мне нужно добавить недостающие маршруты во время выполнения или (менее удобно) перезапустить пул приложений из другого веб-приложения (которое имеет b een разработан на платформе 4.5 и, очевидно, работает на другом пуле)

Другие мысли по этому вопросу? спасибо.

+0

Что является источником конфигурации? Вы упомянули базу данных, это SQL? Можете ли вы получить маршруты из файла JSON? –

+0

На самом деле это коллекция mongoDB с метаданными маршрута –

ответ

3

Первый вопрос: database означает, что вы говорите: I add another route to the database, и вы можете сохранить свои маршруты в файле JSON, XML или INI.

Если вы можете, например, сохранить маршруты в файле формата JSON, то возможно для маршрутов динамически доступны во время выполнения (as you can read in the ASP.NET Core Documentation)

You can find a full blog post about this here.

Предполагая, что 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 (совсем не совсем и напомнил здесь только для полноты) решение может заключаться в создании консольного приложения, которое добавляет изменения в файл в файл, а затем использует этот файл в конфигурации приложения.

С уважением!

+0

Привет @ radu-matei, reloadOnChange делает вещи весьма интересными, позвольте мне проверить это и поблагодарить за то, что вы указали в правильном направлении, я дам вам знать, работает ли этот подход для меня. –

+0

Несомненно. Если у вас возникнут другие вопросы, я с удовольствием попробую помочь. –

Смежные вопросы