Asp.net核心2.0中间件 - 使用appsettings中的参数,这些参数在运行时发生变化

时间:2018-04-10 10:46:08

标签: c# asp.net-core-2.0 middleware

我们需要根据appsettings.json中的参数在中间件中做一些工作。参数可以在运行时更改。

为此,我可以在设置文件注册时设置reloadOnChange      builder.AddJsonFile(" appsettings.json&#34 ;,                             optional:false,reloadOnChange:true)

我在控制器中使用IOptionsSnapshopt的情况下的工作,因为每个请求都创建了一个控制器。但是中间件就是生命周期。

我发现Asp.net core 2.0 middleware - accessing config settings在哪里写了如何从appsettings访问参数。 - >但是,如果参数在运行时更改,则无法正常工作。

1 个答案:

答案 0 :(得分:4)

根据文档ASP.NET Core Middleware: Per-request dependencies

  

由于中间件是在应用程序启动时构建的,而不是按请求构建,因此中间件构造函数使用的作用域生存期服务在每个请求期间不会与其他依赖注入的类型共享。如果必须在中间件和其他类型之间共享作用域服务,请将这些服务添加到Invoke方法的签名中。 Invoke方法可以接受依赖注入填充的其他参数。

例如,代替在构造函数中,将IOptionsSnapshot参数添加到Invoke方法。

public static class HelloWorldMiddlewareExtensions
{
    public static IApplicationBuilder UseHelloWorld(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<HelloWorldMiddleware>();
    }
}

public class HelloWorldMiddleware
{
    private readonly RequestDelegate _next;

    public HelloWorldMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context, IOptionsSnapshopt<AppSettings> options)
    {
        await context.Response.WriteAsync($"PropA: {options.Value.PropA}");
    }
}

public class AppSettings
{
    public string PropA { get; set; }
}