首页 新闻 会员 周边 捐助

ASP.NET CORE如何通过承载启动注册中间件?

0
悬赏园豆:50 [已解决问题] 解决于 2020-07-30 17:19

目的

我希望在不改动原项目代码的前提下通过承载启动的方式注册插件来添加额外的中间件,但如何在插件中获取注册中间件所需的IApplicationBuilder是我当前面临的最大问题。
承载启动官方文档
依据文档,通过继承IHostingStartup可以注册插件并在项目启动时自动加载:

// 插件
public class MyStartup : IHostingStartup
{
    // 实现IHostingStartup接口需要重写Configure(IWebHostBuilder)
    public void Configure(IWebHostBuilder builder)
    {
        // TODO: 我想通过builder获取一个IApplicationBuilder对象来注册中间件
    }
}

核心问题

  • 如何通过IWebHostBuilder获取IApplicationBuilder对象?
曰..曰的主页 曰..曰 | 初学一级 | 园豆:159
提问于:2020-07-20 12:57
< >
分享
最佳答案
1
public class RequestSetOptionsStartupFilter : IStartupFilter
{
    public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
    {
        return builder =>
        {
            builder.UseMiddleware<RequestSetOptionsMiddleware>();
            next(builder);
        };
    }
}

官方文档上有

收获园豆:50
gt1987 | 小虾三级 |园豆:1150 | 2020-07-30 16:53

谢谢。

曰..曰 | 园豆:159 (初学一级) | 2020-07-30 17:19
其他回答(4)
0

看源码可以知道,在Iwebhostbuilder 会调用build方法生成一个webhost,在build方法中,会调用buildcommonService方法,new几个实例,就有IApplicationBuilderFactory, 然后在host初始化的时候会调用BuildApplication,然后生成IApplicationBuilder

不知道风往哪儿吹 | 园豆:2037 (老鸟四级) | 2020-07-20 13:48

那我如何在Configure方法中通过IWebHostBuilder拿到IApplicationBuilder呢?
可以的话,希望能给出简单的流程或思路。

支持(0) 反对(0) 曰..曰 | 园豆:159 (初学一级) | 2020-07-20 14:57

@曰..曰: IHostingStartup 是用来注册服务的
不是用来添加中间件的
,继承IStartUP 接口把

支持(0) 反对(0) 不知道风往哪儿吹 | 园豆:2037 (老鸟四级) | 2020-07-20 15:12

@不知道风往哪儿吹: 配置额外的StartUp会覆盖原项目的StartUp吗,我记得StartUp只有一个能生效。

支持(0) 反对(0) 曰..曰 | 园豆:159 (初学一级) | 2020-07-20 15:43

@曰..曰: 不会的,累加的

支持(0) 反对(0) 不知道风往哪儿吹 | 园豆:2037 (老鸟四级) | 2020-07-20 15:55

@不知道风往哪儿吹:
我尝试了以下方案:

    // 承载启动
    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,可以成功注册中间件,但是原有的服务无法访问了,是我哪里写的有问题吗?

支持(0) 反对(0) 曰..曰 | 园豆:159 (初学一级) | 2020-07-20 16:19
0

已通过stackoverflow得到了满意的答案:论坛地址

曰..曰 | 园豆:159 (初学一级) | 2020-07-22 14:33
1

可以参见下我做的详细解释demo!地址

Jonny-Xhl | 园豆:691 (小虾三级) | 2020-10-21 18:55
0

public class RequestSetOptionsStartupFilter : IStartupFilter
{
public Action<IApplicationBuilder> Configure(Action<IApplicationBuilder> next)
{
return builder =>
{
builder.UseMiddleware<RequestSetOptionsMiddleware>();
next(builder);
};
}
}

许你一世浮沉 | 园豆:202 (菜鸟二级) | 2020-11-18 19:24
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册