首页 > 解决方案 > 如何在 HostingStartup 中注册中间件?

问题描述

背景

我希望在不改变原项目代码的情况下,通过注册插件的方式添加额外的中间件,但是如何在插件IApplicationBuilder中获取注册中间件所需的内容是我目前面临的最大问题。 根据Hosting Startup Document,插件可以通过继承注册并在项目启动时自动加载,例如:
IHostingStartup

// plugin
public class MyStartup: IHostingStartup
{
     // Implement the IHostingStartup interface
     public void Configure(IWebHostBuilder builder)
     {
         // TODO: I want to get an IApplicationBuilder object to register middleware
     }
}

问题

如何获取IApplicationBuilder对象IWebHostBuilder

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

解决方案


在官方文档中,Extend Startup with startup filters解释了这IStartupFilter可能在这里有用:

用于IStartupFilter在应用程序中间件管道的开头或结尾配置中间件,Configure无需显式调用Use{Middleware}.

这是一个示例实现:

public class MyStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return app =>
        {
            app.UseMiddleware<MyMiddleware>();
            next(applicationBuilder);
        };
    }
}

在此示例中,我们将添加MyMiddleware到管道的开头,这意味着它在管道的其余部分之前运行。要在管道末尾运行MyMiddleware,请切换app.UseMiddleware和的顺序next

您还必须向 DI 容器注册此实现,如下所示:

// plugin
public class MyStartup : IHostingStartup
{
     // Implement the IHostingStartup interface
     public void Configure(IWebHostBuilder builder)
     {
         builder.ConfigureServices(services =>
         {
             services.AddTransient<IStartupFilter, MyStartupFilter>();
         });
     }
}

尽管这可行,但它并不像您可能需要的那样灵活。例如,它不允许您在应用添加的中间件之间注入中间件。


推荐阅读