1

WebServiceProvider によって実装された Web サービスで Java の HTTP Server オブジェクトを使用しています。クライアントのリクエストに関係なく、回答がチャンクされており、コンテンツの長さに合わせる必要があることがわかりました。問題は Web サーバー プロバイダーではなく、サーバーにあると思います。また、チャンクではなくコンテンツの長さを使用するように http ヘッダーを構成するにはどうすればよいですか?

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

1 に答える 1

1

com.sun.net.httpserverHTTPServerについて話していると思います。Endpoint.publishさらに、HTTPServerをサポートするサービスプロバイダーを使用して、への呼び出しでサーバーをサービスに接続していると仮定します。

キーはHttpExchange.sendResponseHeadersメソッドにあります:

応答長パラメーターがゼロより大きい場合、これは送信する正確なバイト数を指定し、アプリケーションはその正確な量のデータを送信する必要があります。応答長パラメータがゼロの場合、チャンク転送エンコーディングが使用され、任意の量のデータが送信される可能性があります。アプリケーションは、OutputStreamを閉じることによって応答本文を終了します。

したがって、ハンドラーがの正の値を渡している限りresponseLength、Content-Lengthが使用されます。もちろん、そのためには、送信するデータの量を事前に知っておく必要がありますが、そうではない場合もあります。それがそうであるかどうかは、バインディングの実装に完全に依存します、私は恐れています。これが標準化されているとは思いません。実際、WebServiceProvider/HTTPServerが標準化されているとはまったく思いません。

ただし、プロバイダーが協力的でない場合でも、頼りになるものがあります。バッファーを追加するフィルターを作成し、サービスの公開に使用しているHttpContextに追加します。これを行うには、書き込まれたデータをバッファリングするHttpExchangeの実装を記述し、それをハンドラーが応答を書き込むためのフィルターチェーンに渡してから、戻ってきたときにバッファーされたコンテンツを書き込む必要があると思います。いつ設定するresponseLengthか。

于 2011-08-02T20:26:45.527 に答える