我希望在不改动原项目代码的前提下通过承载启动的方式注册插件来添加额外的中间件,但如何在插件中获取注册中间件所需的IApplicationBuilder
是我当前面临的最大问题。
承载启动官方文档
依据文档,通过继承IHostingStartup
可以注册插件并在项目启动时自动加载:
// 插件
public class MyStartup : IHostingStartup
{
// 实现IHostingStartup接口需要重写Configure(IWebHostBuilder)
public void Configure(IWebHostBuilder builder)
{
// TODO: 我想通过builder获取一个IApplicationBuilder对象来注册中间件
}
}
IWebHostBuilder
获取IApplicationBuilder
对象?public class RequestSetOptionsStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
builder.UseMiddleware<RequestSetOptionsMiddleware>();
next(builder);
};
}
}
官方文档上有
谢谢。
看源码可以知道,在Iwebhostbuilder 会调用build方法生成一个webhost,在build方法中,会调用buildcommonService方法,new几个实例,就有IApplicationBuilderFactory, 然后在host初始化的时候会调用BuildApplication,然后生成IApplicationBuilder
那我如何在Configure
方法中通过IWebHostBuilder
拿到IApplicationBuilder
呢?
可以的话,希望能给出简单的流程或思路。
@曰..曰: IHostingStartup 是用来注册服务的
不是用来添加中间件的
,继承IStartUP 接口把
@不知道风往哪儿吹: 配置额外的StartUp会覆盖原项目的StartUp吗,我记得StartUp只有一个能生效。
@曰..曰: 不会的,累加的
@不知道风往哪儿吹:
我尝试了以下方案:
// 承载启动
public class MyHostingStartup : IHostingStartup
{
public void Configure(IWebHostBuilder builder)
{
builder.UseStartup<MyStartup>();
}
}
// 注册的StartUp
public class MyStartup
{
public void Configure(IApplicationBuilder app)
{
// 中间件注册
app.Use((next) =>{
return async (context) =>
{
Console.WriteLine("Test");
await next(context);
};
});
}
public void ConfigureServices(IServiceCollection services)
{
}
}
通过IWebHostBuilder
添加了一个StartUp
,可以成功注册中间件,但是原有的服务无法访问了,是我哪里写的有问题吗?
public class RequestSetOptionsStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
builder.UseMiddleware<RequestSetOptionsMiddleware>();
next(builder);
};
}
}