【问题标题】:in ASP.NET Core, is there any way to set up middleware from Program.cs?在 ASP.NET Core 中,有没有办法从 Program.cs 设置中间件?
【发布时间】:2017-09-22 01:10:05
【问题描述】:

我正在为 ASP.NET Core 网站构建一个支持库。我有一些中间件需要启用,并且由于它们的作用,它们需要在任何其他中间件之前添加。

我可以在 IWebHostBuilder 上创建一个扩展方法来添加服务,同样用于配置日志记录,但我看不到任何以编程方式添加中间件的方法。有没有办法做到这一点?查看 WebHost/WebHostBuilder 的源代码并没有跳出来。


鉴于第一条评论,我可能还不够清楚。我知道如何创建中间件并使用它。我要做的是确保当框架在启动时调用 Configure(IApplicationBuilder app) 方法时,我的中间件已经到位。以类似于能够在创建启动之前执行 ServiceConfiguration 的方式。所以像

这样的扩展方法
public static IWebHostBuilder AddPayscaleHostingServices(this IWebHostBuilder webHostBuilder, string serviceName)
{
    return webHostBuilder.ConfigureServices(collection =>
    {
        collection.RegisterPayscaleHostingServices();
    }).ConfigureLogging(factory =>
    {

    });
}

使我能够在 webHostBuilder.Build 方法之前进行一些设置,但我在 IApplicationBuilder 上没有看到任何类似的中间件/任何东西。

谢谢, 埃里克

【问题讨论】:

  • 请参考this并先做自己的研究。 docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware
  • 我知道如何创建中间件,我知道如何添加中间件。我不知道的是如何确保在 Startup 类上调用 Configure 方法之前启用我的中间件。在一个完美的世界里,我将有机会在用户代码之前接触 IApplicationBuilder。

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


【解决方案1】:

您可以使用启动过滤器来实现此目的。启动过滤器允许您从 DI 容器解析的服务配置中间件。

定义启动过滤器很简单:

public class MyStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return app =>
        {
            // Configure middleware
            // ...

            // Call the next configure method
            next(app);
        };
    }
}

始终确保调用next(app) 或任何其他不会配置的中间件。

现在在 ConfigureServices 方法中将启动过滤器注册为 IStartupFilter 的单例实现:

services.AddSingleton<IStartupFilter, MyStartupFilter>();

【讨论】:

  • 谢谢!出于某种原因,IStartupFilter 这个名字让我想到了错误的方向。现在我看了一下,以及它是如何在 WebHost 中使用的,这是有道理的。不是名字,而是我如何使用它。
  • 是的,我以前也很困惑。但是,它是一种配置中间件的简洁而强大的方法。
猜你喜欢
  • 1970-01-01
  • 2021-05-01
  • 2019-04-16
  • 2017-02-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2011-12-11
相关资源
最近更新 更多