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