启动后添加新的FileServer位置(启动后编辑中间件)

时间:2017-08-16 12:53:13

标签: c# .net .net-core asp.net-core-webapi kestrel-http-server

我的网络应用程序需要让管理员用户从.net core 2 app添加和删除服务文件夹。我找到了一种提供服务文件夹列表的方法,但是一旦配置了应用程序,我找不到动态添加或删除它们的方法。

如何在应用程序中重新运行configure函数?或者,如何在已运行的服务中添加或删除import urllib.request import time opener = urllib.request.build_opener( urllib.request.ProxyHandler( {'http': 'http://127.0.0.1:9999'})) start = time.time() print(opener.open('http://example.com').read()) print ('total time: {0}'.format(time.time()-start)) 配置?

UseFileServer()

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

1 个答案:

答案 0 :(得分:2)

您可能希望根据您的设置动态注入FileServer中间件。

微软的Chris Ross'Github上有一个示例项目:https://github.com/Tratcher/MiddlewareInjector/tree/master/MiddlewareInjector

您必须将上述回购中的MiddlewareInjectorOptionsMiddlewareInjectorMiddlewareMiddlewareInjectorExtensions类添加到您的项目中。

然后,在你的Startup类中,将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()

我创建了一个包含所需代码的Gist:https://gist.github.com/michaldudak/4eb6b0b26405543cff4c4f01a51ea869