2008-10-02 39 views
3

我有一個HTTP服務器響應POST請求返回大的正文(它是一個SOAP服務器)。這些機構通過分塊「流」。如果在響應流式傳輸過程中遇到錯誤,我如何向客戶端報告錯誤並保持連接打開?該實現使用專有的HTTP/SOAP堆棧,所以我對HTTP協議級別的答案感興趣。如何在不關閉連接的情況下通過分塊的http repsonse中途報告錯誤?

+0

馬克,我做了一個更新我原來的職位。但是,我不知道你是否會注意到它,因爲你已經將答案標記爲已接受。此評論在此處通過出現在您帳戶的「回覆」標籤中獲得您的關注... – Alexander 2008-10-02 21:39:59

回答

2

一旦服務器將狀態行(響應的第一行)發送到客戶端,就不能再更改響應的狀態碼。許多服務器通過在內部緩衝來延遲發送響應,直到緩衝區滿。在緩衝區填滿時,您仍然可以改變主意。

如果您的客戶端有權訪問響應頭,則可以使用分塊編碼允許服務器在分塊編碼主體後添加帶有頭的尾部的事實。因此,遇到錯誤的服務器可以優雅地停止發送主體,然後發送一個將某個標頭設置爲某個值的預告片。然後,您的客戶會將此標題的存在解釋爲發生錯誤的標誌。

+0

我曾希望談判交付「替代」身份的一些慣例。例如。將其推入最終的零大小塊的擴展中(0之後; \ r \ n \ r \ n之前)。 – 2008-10-02 21:34:53

0

只要response.iscommitted()返回false,您就可以更改狀態碼。 (fot HttpServletResponse在java中,我確定在其他語言中存在一個等價物)

2

還要記住,分塊響應可以包含"footers",它們就像HTTP頭一樣。失敗後,您可以發送一個頁腳,例如:

X-RealStatus: 500 Some bad stuff happened

或者,如果你成功了:

X-RealStatus: 200 OK
相關問題