【问题标题】:Set response status in ASP.NET core middleware在 ASP.NET 核心中间件中设置响应状态
【发布时间】:2020-04-02 09:39:48
【问题描述】:

我有一个中间件,它对客户端隐藏异常并在出现任何异常时返回 500 错误:

public class ExceptionHandlingMiddleware
{
    private readonly RequestDelegate _next;

    public ExceptionHandlingMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public async Task Invoke(HttpContext context)
    {
        try
        {
            await _next.Invoke(context);
        }
        catch (Exception exception)
        {
            var message = "Exception during processing request";
            using (var writer = new StreamWriter(context.Response.Body))
            {
                context.Response.StatusCode = 500; //works as it should, response status 500
                await writer.WriteAsync(message);
                context.Response.StatusCode = 500; //response status 200
            }
        }
    }
}

我的问题是,如果我在写正文之前设置响应状态,客户端会看到这个状态,但是如果我在写消息到正文之后设置状态,客户端会收到状态为 200 的响应。

有人能解释一下为什么会这样吗?

附:我正在使用 ASP.NET Core 1.1

【问题讨论】:

    标签: asp.net asp.net-core


    【解决方案1】:

    这是设计使然,当您了解 HTTP 的工作原理时。

    标头位于数据流的开头(请参阅wiki example)。发送数据后,您将无法更改/修改标头,因为数据已经通过网络发送。

    如果您想稍后设置它,则必须缓冲整个响应,但这会增加内存使用量。这里是a sample,关于如何将流换成内存流。

    【讨论】:

      猜你喜欢
      • 2020-10-16
      • 2017-10-31
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      • 2017-06-09
      • 1970-01-01
      • 2021-03-29
      相关资源
      最近更新 更多