3

我有一个 HTTP 服务器,它返回大型正文以响应 POST 请求(它是一个 SOAP 服务器)。这些主体通过分块“流式传输”。如果我在流式传输响应的过程中遇到错误,我如何向客户端报告该错误并仍然保持连接打开?该实现使用专有的 HTTP/SOAP 堆栈,因此我对 HTTP 协议级别的答案感兴趣。

4

3 回答 3

2

一旦服务器将状态行(响应的第一行)发送到客户端,您就不能再更改响应的状态代码。许多服务器通过在内部缓冲响应来延迟发送响应,直到缓冲区已满。当缓冲区填满时,您仍然可以改变对响应的看法。

如果您的客户端可以访问响应标头,则可以使用分块编码允许服务器在分块编码主体之后添加带有标头的预告片这一事实。因此,遇到错误的服务器可以优雅地停止发送正文,然后发送一个将某些标头设置为某个值的预告片。然后,您的客户会将此标头的存在解释为发生错误的标志。

于 2008-10-02T21:27:28.727 回答
2

还要记住,分块响应可以包含“页脚”,就像 HTTP 标头一样。失败后,您可以发送页脚,例如:

X-RealStatus:500 发生了一些不好的事情

或者如果你成功了:

X-RealStatus: 200 OK
于 2008-10-02T21:38:41.087 回答
0

只要 response.iscommitted() 返回 false,您就可以更改状态代码。(在 java 中使用 HttpServletResponse,我确定在其他语言中存在等价物)

于 2008-10-02T21:33:46.153 回答