在流式响应的中途设置http状态

时间:2017-07-28 11:10:23

标签: c# http-headers

我正在传输HTTP响应,并且在执行过程中发生了错误,我在下面进行了模拟。最终用户将其视为200响应,因为我了解状态是在响应头中发送的。当我的错误发生时,我已经抓住它并将状态重置为500,为时已晚。如何设置"真实"流式传输原始标题后状态为500?

var httpResponse = HttpContext.Current.Response;
httpResponse.BufferOutput = false;
httpResponse.ContentType = "application/xml";
try
{
    httpResponse.Write("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + Environment.NewLine);
    httpResponse.Write($"<{Constants.XmlHeaderTag}>");
    var theline = 0;
    while (some condition)
    {
        if (theline++ == 3) throw new Exception("Got an error");
        var innerXml = "some xml";
        httpResponse.BinaryWrite(Encoding.UTF8.GetBytes(innerXml));
    }
    httpResponse.Write($"</{Constants.XmlHeaderTag}>");
    httpResponse.OutputStream.Flush();
    httpResponse.End();
}
catch (Exception ex)
{
    httpResponse.Status = 500;
    logError(ex);
}

1 个答案:

答案 0 :(得分:1)

你做不到。 http标头位于有效负载中的数据之前。发送标题后:发送标题。在此之后您无法设置标头,即使可以,也没有客户端会理解您的意思,因为在有效负载期间无法接收标头。你所能做的只是杀死回应;客户端会知道他们没有得到所有东西(假设您发送了一个内容长度的标题),并且xml将格式错误(未正确终止),因此他们会发现它很快就会被破坏或者后面。