代码之家  ›  专栏  ›  技术社区  ›  Aiden

我的中间件将如何在管道中运行?

  •  0
  • Aiden  · 技术社区  · 6 年前

    我目前对.NETCore(以及与.NET相关的任何东西)非常陌生。我正在学习一门关于Pluralsight的在线课程,到目前为止,我们已经生成了以下方法:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env, IGreeter greeter, ILogger<Startup> logger)
            {
                app.Use(next =>
                {
                return async context =>
                    {
                        logger.LogInformation("Request Incoming");
                        if (context.Request.Path.StartsWithSegments("/my"))
                        {
                            logger.LogInformation("Inside first Middleware!");
                            await context.Response.WriteAsync("Inside first Middleware");
                        }
                        else
                        {
                            logger.LogInformation("Request going to next Middleware");
                            //await next(context);
                        }
                    };
                });
    
                app.UseWelcomePage(new WelcomePageOptions
                {
                    Path = "/wp"
                });
    
                app.Run(async (context) =>
                {
                    var greeting = greeter.getMessageOfTheDay();
                    await context.Response.WriteAsync(greeting);
                });
            }
    

    我对管道在某些场景中的工作方式有点困惑。

    例如,如果我要删除第一个中间件app.use和app.UseWelcomePage,则它将成为第一个中间件。 如果路径不满足,app.usewlcomepage将如何调用下一个中间件app.run?我想我们总是需要等待。下一步()? 在我的情况下,将执行app.run。

    对于我的第二个问题,下面的代码已经注释掉了第一个中间件中的wait.next(),当我运行IISExpress时,浏览器正在加载并考虑该做什么。 在标题选项卡中,简要显示UseWelcome页面中的标题。如果没有链接,这怎么可能?

    1 回复  |  直到 6 年前
        1
  •  0
  •   itminus    6 年前

    如果路径不满足,app.usewlcomepage将如何调用下一个中间件app.run?我想我们总是需要等待。下一步()?

    是的,我们确实需要一个 await next() . 但是 已添加到中 WelcomePageMiddleware . 有关更多详细信息,请参阅的源代码 WelcomePageMiddleware . 和 app.UseWelcomePage(...) 这里只不过是一个最终调用中间件的扩展方法:

    return app.UseMiddleware<WelcomePageMiddleware>(Options.Create(options));
    

    调用是中间件的责任 next ,而不是扩展方法。

    作为旁注,通常有4种中间产品:

    1. next => context => { /* ... */ }
    2. 内联样式: (context,next)=>{ /* ... */ })
    3. IMiddleware 接口。
    4. 按约定的中间件:一个没有接口的类。

    ,我们叫 等待下一个 await next(context) 调用下一个中间件。当与第1种、第3种和第4种中间件一起使用时,我们应该使用 等待下一个(上下文) 而不是 .

    在我运行IISExpress的第一个中间件中,我已经注释掉了wait.next()中的以下代码,浏览器正在加载并思考该做什么。在标题选项卡中,简要显示UseWelcome页面中的标题。如果没有链接,这怎么可能?

    不知道“如果没有链接”是什么意思。但是,如果您对 等待下一个(上下文) 等待下一个(上下文) 等待下一个(上下文) ,浏览器将在不更改标题的情况下挂起几秒钟,但如果您等待足够的时间,您将得到如下结果 <title>Can't reach this page</title> 或者一个空标题。