2017-08-16 59 views
3

我的web應用程序需要讓管理員用戶從.net core 2應用程序添加和刪除服務的文件夾。我找到了一種提供服務文件夾列表的方法,但是我找不到一種方法來在應用程序配置後動態地添加或刪除它們。啓動後添加新的FileServer位置(啓動後編輯中間件)

如何從應用程序中重新運行配置功能?或者,如何在已經運行的服務中添加或刪除UseFileServer()配置?

public class Startup 
{ 
    public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) 
    { 
     app.UseDeveloperExceptionPage(); 
     app.UseMvc(); 

     //get these dynamically from the database 
     var locations = new Dictionary<string, string>{ 
      {@"C:\folder1", "/folder1"}, 
      {@"D:\folder2", "/folder2"} 
     }; 
     foreach (var kvp in locations) 
     { 
      app.UseFileServer(new FileServerOptions() 
      { 
       FileProvider = new PhysicalFileProvider(
        kvp.Key 
       ), 
       RequestPath = new PathString(kvp.Value), 
       EnableDirectoryBrowsing = true 
      }); 
     } 
    } 
} 

我正在使用.net core 2.0.0-preview2-final。

回答

2

您可能希望根據您的設置動態注入FileServer中間件。

有微軟的Chris Ross的Github上的示例項目:https://github.com/Tratcher/MiddlewareInjector/tree/master/MiddlewareInjector

你必須從上述回購加MiddlewareInjectorOptionsMiddlewareInjectorMiddlewareMiddlewareInjectorExtensions類項目。

然後,在你的啓動類,登記MiddlewareInjectorOptions爲單(所以它在整個應用程序可用),並使用MiddlewareInjector:

public class Startup 
{ 
    public void ConfigureServices(IServiceCollection serviceCollection) 
    { 
     serviceCollection.AddSingleton<MiddlewareInjectorOptions>(); 
    } 

    public void Configure(IApplicationBuilder app, IHostingEnvironment env) 
    { 
     app.UseDeveloperExceptionPage(); 

     var injectorOptions = app.ApplicationServices.GetService<MiddlewareInjectorOptions>(); 
     app.UseMiddlewareInjector(injectorOptions); 
     app.UseWelcomePage(); 
    } 
} 

然後,注入無論你想在MiddlewareInjectorOptions和動態配置中間件,像這樣:

public class FileServerConfigurator 
{ 
    private readonly MiddlewareInjectorOptions middlewareInjectorOptions; 

    public FileServerConfigurator(MiddlewareInjectorOptions middlewareInjectorOptions) 
    { 
     this.middlewareInjectorOptions = middlewareInjectorOptions; 
    } 

    public void SetPath(string requestPath, string physicalPath) 
    { 
     var fileProvider = new PhysicalFileProvider(physicalPath); 

     middlewareInjectorOptions.InjectMiddleware(app => 
     { 
      app.UseFileServer(new FileServerOptions 
      { 
       RequestPath = requestPath, 
       FileProvider = fileProvider, 
       EnableDirectoryBrowsing = true 
      }); 
     }); 
    } 
} 

注意,這MiddlewareInjector可以注入只是一個單一的中間件,讓您的代碼應該調用UseFileServer()你要投放的每個路徑。

我已經創建了所需的代碼要點:https://gist.github.com/michaldudak/4eb6b0b26405543cff4c4f01a51ea869

+0

這並沒有解決我的問題。我需要在啓動完成後註冊新的UseFileServer位置。我測試了它,一旦應用程序正在運行,任何新的app.UseFileServer調用都不會執行任何操作。 – TwitchBronBron

+0

然後,我的解決方案應該可以工作。既然你有一個單件MiddlewareInjectorOptions,你可以隨時使用它(只需從服務容器中獲取它)。我前一段時間測試了它,它似乎工作正常。 –

+0

請看看我剛添加的Gist - 起初,沒有文件服務器功能。只有當您啓用/啓用文件服務器URL時,才能通過分別轉到/ c和/ d URL來訪問C和D驅動器的內容。 –