【问题标题】:Why can't the HttpResponse be changed after 'next' call?为什么在“下一个”调用后不能更改 HttpResponse?
【发布时间】:2016-06-24 06:32:10
【问题描述】:
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!");
    });
}

结果响应只有“Before!After!”,但缺少“Hello World!”。为什么会这样?

Asp.net docs 说:

避免在调用下一个之后修改 HttpResponse,管道中的下一个组件之一可能已写入响应,导致它被发送到客户端

我不明白“导致它被发送给客户”是什么意思。

【问题讨论】:

    标签: c# asp.net middleware


    【解决方案1】:

    通过调用 next,您将控制权传递给链中的下一个中间件,这意味着当前中间件失去了控制权,其他中间件可能已写入响应、刷新甚至关闭流。

    “导致它被发送到客户端”意味着进一步的中间件之一可能已经做了一些事情,就像上面的选项一样,导致响应从您的服务器发送到调用它的任何客户端。正如您的代码所证明的那样,这并不保证一定会发生,但这是可能的。因此,为了以防万一,不建议在调用next后写入httpresponse。

    【讨论】:

    • 但在我的情况下,被忽略的是“next”调用中写入的内容,而不是之后所做的更改(即“After!”),这不应该是由任何一个引起的下一次调用写入响应或关闭流。
    • 其实……你是对的。我的问题是由其他原因引起的。我发现如果Map 匹配请求,Run 将不会插入到管道中。
    【解决方案2】:

    我发现原因是如果app.Map 匹配请求,app.Run 将不会插入管道。这出乎我的意料。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-14
      • 2017-02-21
      • 2020-08-12
      相关资源
      最近更新 更多