2011-08-02 15 views
1

我正在使用java的HTTP Server對象和WebServiceProvider實現的Web服務。 我看到,不管客戶的要求,答案是分塊的,我需要它與內容的長度。 所以我假設問題是在服務器,而不是網絡服務器提供商,對不對? 以及如何配置http標頭使用內容長度而不是分塊?如何配置HTTPServer以使用內容長度而不傳輸編碼:chunked?

HttpServer m_server = HttpServer.create(); 
    Endpoint ep= Endpoint.create(new ep()); 
    HttpContext epContext = m_server.createContext("/DownloadFile"); 
    ep.publish(downloadFileContext); 

回答

0

我假設你在說的是com.sun.net.httpserver HTTPServer。我進一步假設您使用支持HTTPServer的服務提供商,通過致電Endpoint.publish將服務器連接到服務。

的關鍵是在HttpExchange.sendResponseHeaders方法:

如果響應長度參數是大於零,這指定的字節的確切數來發送和應用程序必須發送數據的確切的量。如果響應長度參數爲零,則使用分塊傳輸編碼並且可以發送任意數量的數據。應用程序通過關閉OutputStream來終止響應主體。

因此,只要處理程序爲responseLength傳遞正值,就會使用Content-Length。當然,要做到這一點,它必須知道它將提前發送多少數據,這可能不會。恐怕它完全取決於執行綁定。我不認爲這是標準化的 - 事實上,我不相信WebServiceProvider/HTTPServer是完全標準化的。

但是,即使您的提供者不合作,您也可以申請:編寫一個Filter,其中添加了緩衝,並將其添加到您用來發布服務的HttpContext。我認爲要做到這一點,你必須編寫一個實現HttpExchange緩衝寫入到它的數據,將其傳遞到過濾器鏈中,以便處理程序將其響應寫入,然後在寫入緩衝內容時,當它這樣設置responseLength

+0

嗨。它聽起來是正確的,但我有Web服務,這是作爲端點相關發佈,所以服務器上的一些上下文,所以我實際上並沒有通過服務器自己管理任何響應,響應從Web服務發送。 – Sophie

+0

@Sophie:我不明白,對不起。您是否說您不控制將Web服務發佈到HTTPServer的代碼?你可以通過關於你的代碼如何工作的更多細節來編輯你的問題,以及你可以改變哪些部分? –

+0

我已經添加了一個代碼示例。 「ep」是我的網絡服務。所以當客戶端執行http:// ip_add/DownloadFile時,它會轉到我的Web服務。我也知道要發送的數據的長度。 – Sophie

相關問題