我们需要根据appsettings.json中的参数在中间件中做一些工作。参数可以在运行时更改。
为此,我可以在设置文件注册时设置reloadOnChange builder.AddJsonFile(" appsettings.json&#34 ;, optional:false,reloadOnChange:true)
我在控制器中使用IOptionsSnapshopt的情况下的工作,因为每个请求都创建了一个控制器。但是中间件就是生命周期。
我发现Asp.net core 2.0 middleware - accessing config settings在哪里写了如何从appsettings访问参数。 - >但是,如果参数在运行时更改,则无法正常工作。
答案 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; }
}