我的中间件将如何继续运作?

时间:2018-11-11 17:34:10

标签: asp.net-core

我现在在.NET Core(以及所有与.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.usewelcomepage将如何调用正在运行的下一个中间件?我以为我们总是需要await.next()吗?就我而言,app.run将执行。

对于我的第二个问题,在我运行IISExpress的第一个中间件中,用下面的代码注释掉了await.next(),浏览器正在加载并考虑该怎么做。 在标题标签中,简要显示UseWelcomePage中的标题。如果没有链接怎么办?

1 个答案:

答案 0 :(得分:0)

  

如果路径不满足,app.usewelcomepage将如何调用正在运行的下一个中间件?我以为我们总是需要一个await.next()?

是的,我们确实需要await next()但是await next()中已经添加了WelcomePageMiddleware 。有关更多详细信息,请参见WelcomePageMiddleware的源代码。而app.UseWelcomePage(...)只是最终调用中间件的扩展方法:

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

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

请注意,通常有四种中间件:

  1. 原始样式:next => context => { /* ... */ }
  2. 内联样式:(context,next)=>{ /* ... */ })
  3. 基于工厂的中间件:从IMiddleware接口继承的类。
  4. 按约定的中间件:没有接口的类。

在这些中间件中,我们调用 await next() await next(context) 来调用下一个中间件。与中间件的第一种样式,第三种样式和第四种样式一起使用时,我们应该使用await next(context)而不是await next()

  在我运行IISExpress的第一个中间件中,当我在第一个中间件中注释掉await.next()时,使用下面的代码,

,浏览器正在加载并思考该怎么做。在标题的选项卡中,短暂显示UseWelcomePage中的标题。如果没有链接怎么办?

不确定“如果没有链接”是什么意思。但是,如果在第一个中间件中注释await next(context)行,则第二个和第三个中间件将永远不会更改处理请求。如果在注释掉await next(context)之前,已经在浏览器中呈现了WelcomePage,然后注释掉了第一个await next(context),则浏览器将挂起几秒钟而不更改标题,但是如果您等待足够的时间,您会得到类似<title>Can't reach this page</title>或空标题的字样。