我现在在.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中的标题。如果没有链接怎么办?
答案 0 :(得分:0)
如果路径不满足,app.usewelcomepage将如何调用正在运行的下一个中间件?我以为我们总是需要一个await.next()?
是的,我们确实需要await next()
。 但是await next()
中已经添加了WelcomePageMiddleware
。有关更多详细信息,请参见WelcomePageMiddleware
的源代码。而app.UseWelcomePage(...)
只是最终调用中间件的扩展方法:
return app.UseMiddleware<WelcomePageMiddleware>(Options.Create(options));
调用next
而不是扩展方法是中间件的责任。
请注意,通常有四种中间件:
next => context => { /* ... */ }
(context,next)=>{ /* ... */ })
IMiddleware
接口继承的类。 在这些中间件中,我们调用 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>
或空标题的字样。