我正在尝试了解ASP.NET Core管道的工作原理。我想使用StaticFileMiddleware
并传递一些选项。
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
var staticFileOptions = new StaticFileOptions();
app.UseMiddleware<Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware>(staticFileOptions);
}
当我运行我的应用程序时,我收到以下错误
System.InvalidOperationException: A suitable constructor for type 'Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware' could not be located. Ensure the type is concrete and services are registered for all parameters of a public constructor.
at Microsoft.Extensions.Internal.ActivatorUtilities.CreateInstance(IServiceProvider provider, Type instanceType, Object[] parameters)
at Microsoft.AspNetCore.Builder.UseMiddlewareExtensions.<>c__DisplayClass3_0.<UseMiddleware>b__0(RequestDelegate next)
at Microsoft.AspNetCore.Builder.Internal.ApplicationBuilder.Build()
at Microsoft.AspNetCore.Hosting.Internal.WebHost.BuildApplication()
我明白我可以使用
app.UseStaticFiles(staticFileOptions);
但是,由于这是一个学习练习,我想以另一种方式称呼它。
答案 0 :(得分:1)
这是我解决同样问题的方法。
只需创建包含您要传递的属性的新类:
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;
}
答案 1 :(得分:0)
而不是
app.UseMiddleware<Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware>(staticFileOptions);
使用
app.UseMiddleware<Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware>(Microsoft.Extensions.Options.Options.Create(staticFileOptions));
(或将Microsoft.Extensions.Options
粘贴为使用并调用Options.Create
)
这就是在actual code
中实现UseStaticFiles的方法答案 2 :(得分:0)
根据您的错误
System.InvalidOperationException:无法找到类型为“Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware”的合适构造函数。 确保类型具体,服务已注册 公共构造函数的所有参数。
添加公共构造函数或构造函数是私有的
答案 3 :(得分:0)
大多数中间件实际上不仅将它们的选项作为纯类本身(例如在您的情况下为 StaticFileOptions
),而是将其作为 IOptions
包裹在 IOptions<StaticFileOptions>
配置接口中。
幸运的是,您可以使用一种很好的方法来解决这个问题。因此,您可以将 Microsoft.Extensions.Options.Options.Create(staticFileOptions)
的返回值传递给 UseMiddleware
调用。
必须包装在 IOptions 内似乎是多余的等等,但它有好处,例如当您的配置源(文件系统、Azure 应用程序配置等)更改时自动重新加载值。