如何使用中间件<type>(...)并传入选项?

时间:2016-11-29 21:46:45

标签: asp.net-core

我正在尝试了解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);

但是,由于这是一个学习练习,我想以另一种方式称呼它。

4 个答案:

答案 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 应用程序配置等)更改时自动重新加载值。