public void Configure(IApplicationBuilder app) {
app.Map("/hahaha", HandleMapTest);
app.Run(async (context) => {
await context.Response.WriteAsync("Hello World!");
});
}
public static void HandleMapTest(IApplicationBuilder app) {
app.Use(async (context, next) => {
await context.Response.WriteAsync("Before!");
await next.Invoke();
await context.Response.WriteAsync("After!");
});
}
结果回复只有“之前!之后!”,但错过了“Hello World!”。为什么会这样?
在调用next之后避免修改HttpResponse,管道中的下一个组件之一可能已写入响应,导致它被发送到客户端。
我不明白“导致它被发送给客户”是什么意思。
答案 0 :(得分:1)
通过调用next,您将控制权转移到链中的下一个中间件,这意味着当前的中间件失去了控制权,而其他中间件可能已写入响应,刷新它甚至关闭流。
“因为它被发送到客户端”意味着其中一个进一步的中间件可能已经做了某些事情,比如上面的选项,导致响应从您的服务器发送到任何调用它的客户端。正如您的代码所证明的那样,这并不能保证已经发生,但它是可能的。因此,为了以防万一,请在调用next之后写入httpresponse。
答案 1 :(得分:0)
我发现原因是如果app.Run
与请求匹配,app.Map
将不会插入管道。这对我来说非常出乎意料。