gpt4 book ai didi

asp.net-core - 响应管道

转载 作者:行者123 更新时间:2023-12-01 13:43:10 24 4
gpt4 key购买 nike

我在使用 Asp.net core 1.0 RTM 时遇到了困难。例如,在下面的情况下,我们将看到输出结果为“-Message_1--Message_5-”:

 public class MessageMiddleware
{
private readonly RequestDelegate _next;
private readonly IApplicationBuilder _app;

public MessageMiddleware(RequestDelegate next, IApplicationBuilder app)
{
_next = next;
_app = app;
}

public async Task Invoke(HttpContext context)
{
var started1 = context.Response.HasStarted;//false
await context.Response.WriteAsync("-Message_1-");
var test = true; // will hit this line
var started2 = context.Response.HasStarted;//true
await context.Response.WriteAsync("-Message_5-");

await _next.Invoke(context);
}
}

但在这种情况下(添加了 header “Content-Type”),结果将仅为“-Message_1-”并且执行真的停止了:

  public class MessageMiddleware
{
private readonly RequestDelegate _next;
private readonly IApplicationBuilder _app;

public MessageMiddleware(RequestDelegate next, IApplicationBuilder app)
{
_next = next;
_app = app;
}

public async Task Invoke(HttpContext context)
{
var started1 = context.Response.HasStarted;//false
await context.Response.WriteAsync("-Message_1-");
var started2 = context.Response.HasStarted;//true
context.Response.ContentType = "text/html";
var test = true; // will NOT hit this line
var started3 = context.Response.HasStarted;//will NOT hit this line
await context.Response.WriteAsync("-Message_5-"); //will NOT hit this line

await _next.Invoke(context);
}
}

我在官方文档中只找到了这句话:

Avoid modifying HttpResponse after invoking next, one of the next components in the pipeline may have written to the response, causing it to be sent to the client.

这个问题在 SO: Why can't the HttpResponse be changed after 'next' call?

但是仅仅了解在中间件管道期间与 HttpContext.Response 的 Prop 的交互以及这种交互如何影响最终结果 - HttpResponse 的 header 和正文内容是不够的。

有人可以解释 ASP.NET Core 处理响应的一般行为吗?例如,何时将响应 header 发送到客户端以及设置 HttpContext.Response 属性( header 、正文内容)对此有何影响?中间件内部(外部)管道何时终止?

谢谢!

最佳答案

作为一般规则,当客户端向服务器发出请求时,它会得到响应。该响应包含 header 和正文。 header 包含有关响应的许多信息,如内容类型、使用的编码/压缩、cookie 等。这是 live.asp.net 网站发回的 header 示例,如 chrome 开发人员工具所示:

enter image description here

响应的另一部分是正文。它通常包含 html 或 json。这是同一响应的正文屏幕截图:

enter image description here

考虑它的最简单方法是将这两个一起发送给客户端,首先是 header ,然后是正文。因此,作为开发人员,您在影响 header 的响应对象上设置任何值的唯一机会是在您开始发送正文时。一旦您开始发送响应正文,您就不能再更改 header ,因为它们是在正文开始发送之前作为响应的第一部分发送的。

这就是为什么@tseng 说“在向响应流中写入内容后不要设置 header ”。

如果开发人员不熟悉 http header ,他们可能不会意识到 context.Response.ContentType = "text/html" 正在更改 header ,但在幕后,这正是它的作用是在做。同样,设置 cookie 会在后台更改响应 header 。通常,如果您要更改响应对象的某些属性,您应该问问自己“这会更改 http header 吗?”如果答案是"is",那么您需要在调用 Response.WriteAsync 之前执行此操作。

关于asp.net-core - 响应管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38219211/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com