Asp.net core 如何使用中间件<;类型>;(…)和传入选项?
我试图了解ASP.NET核心管道是如何工作的。我想使用Asp.net core 如何使用中间件<;类型>;(…)和传入选项?,asp.net-core,Asp.net Core,我试图了解ASP.NET核心管道是如何工作的。我想使用StaticFileMiddleware并传入一些选项 public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory) { var staticFileOptions = new StaticFileOptions(); app.UseMiddleware<Microsoft.Asp
StaticFileMiddleware
并传入一些选项
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var staticFileOptions = new StaticFileOptions();
app.UseMiddleware<Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware>(staticFileOptions);
}
但是,由于这是一个学习练习,我想用另一种方式来称呼它。而不是
app.UseMiddleware<Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware>(staticFileOptions);
app.UseMiddleware(staticFileOptions);
使用
app.use中间件(Microsoft.Extensions.Options.Options.Create(staticFileOptions));
(或将Microsoft.Extensions.Options
粘贴为使用和调用Options.Create
)
这是根据您的错误在中实现UseStaticFiles的方式 System.InvalidOperationException:找不到类型为“Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware”的合适构造函数确保类型是具体的,并且服务注册为公共构造函数的所有参数
添加公共构造函数或您的构造函数是私有的这是我解决相同问题的方法 只需使用要传递的属性创建新类:
public class LoggingOption
{
public bool ToLog { get; set; }
}
这就是初始化的方法
app.UseMiddleware<LoggingMiddleware>(Options.Create(new LoggingOption{ ToLog = true }));
app.useMidleware(Options.Create(newloggingOption{ToLog=true}));
这是构造器
public LoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IOptions<LoggingOption> options)
{
_next = next;
_logger = loggerFactory.CreateLogger<LoggingMiddleware>();
_toLog = options.Value.ToLog;
}
public logging中间件(RequestDelegate-next、ILoggerFactory-loggerFactory、IOptions选项)
{
_下一个=下一个;
_logger=loggerFactory.CreateLogger();
_toLog=options.Value.toLog;
}
大多数中间件实际上不仅将其选项作为纯类本身,例如在您的案例中StaticFileOptions
,而是将其包装在IOptions
配置界面中作为IOptions
幸运的是,有一种很好的方法可供您使用。因此,您可以将Microsoft.Extensions.Options.Options.Create(staticFileOptions)的返回值传递到UseMediddleware
调用中
必须包装内部IOption可能看起来是多余的,等等,但它也有好处,例如在配置源(文件系统、Azure应用程序配置等)更改时自动重新加载值。这是一个更好的答案:这实际上是错误的。此错误与是否具有公共构造函数无关。如果找不到匹配的构造函数,或者至少有一个构造函数作为参数所需的服务无法找到,则会引发此错误—实际上是这样!我就是这样!
public class LoggingOption
{
public bool ToLog { get; set; }
}
app.UseMiddleware<LoggingMiddleware>(Options.Create(new LoggingOption{ ToLog = true }));
public LoggingMiddleware(RequestDelegate next, ILoggerFactory loggerFactory, IOptions<LoggingOption> options)
{
_next = next;
_logger = loggerFactory.CreateLogger<LoggingMiddleware>();
_toLog = options.Value.ToLog;
}