c# - 如何在 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
?
解决方案
在官方文档中,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>();
});
}
}
尽管这可行,但它并不像您可能需要的那样灵活。例如,它不允许您在应用添加的中间件之间注入中间件。
推荐阅读
- authentication - SendGrid 域认证 Heroku
- amazon-web-services - 可以仅在特定 IP 上禁用 Aws 速率限制吗?
- python - 如何使用键盘启动 python 代码
- flutter - 按下返回按钮时,在颤动中处理后使用了 Videoplayercontroller 的错误
- android - 我一直在尝试在 kotlin 中使用 For Loop 来遍历这个 JsonObject
- android - 如何从 PagingData 获取数据
对象到达 ViewHolder 之前? - reactjs - 为什么导入到 react jsx 文件的函数返回“对象不是函数错误消息”?
- c# - 如何避免看似自动引用“父”命名空间?
- github - 将 master 变基到上游
- parsing - Logstash grok - Apache 访问日志