21

クライアントを使用して、Swift オブジェクト ストレージに保存されている特定のファイルに関する情報を取得しています。このファイルは、REST Api を介してアクセスできます。Swift では、指定されたオブジェクトにつながる HEAD メソッドと URL は、HTML 応答の (コンテンツがない) ヘッダーに含まれるメタデータ (ハッシュ、タイムスタンプなど) を返します。

私のコードは、ファイル サイズが 2GB 未満の場合に完全に機能します。HttpResponseMessage を取得し、必要なデータを解析できますが、2 GB を超えるファイルを要求すると、「構成された最大バッファー サイズよりも多くのバイトをバッファーに書き込むことはできません: 2147483647」という例外が発生します。

HttpClient プロパティ MaxResponseContentBufferSize を 2GB を超える値に設定できないことは理解していますが、そのコンテンツを取得したくありません。これはバグですか、それともこれを解決するためのより良い方法はありますか?

public HttpResponseMessage FileCheckResponse(string objectName)
   {
        //create url which will be appended to HttpClient (m_client)
        string requestUrl = RequestUrlBuilder(m_containerName, objectName);
        //create request message with Head method
        HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Head, requestUrl);
        //exception thrown here... 
        HttpResponseMessage response = m_client.SendAsync(request).Result;            

        return response;
    }

Dev HTTP Client (Chrome 拡張機能) を使用して同じアクションを実行しようとしても、問題はありません。Content-Length ヘッダーが実行不可能になっているようです。Dev HTTP クライアントからの出力は次のとおりです。

Content-Length: 3900762112
Accept-Ranges: bytes
Last-Modified: Fri, 06 Sep 2013 16:24:30 GMT
Etag: da4392bdb5c90edf31c14d008570fb95
X-Timestamp: 1378484670.87557
Content-Type: application/octet-stream
Date: Tue, 10 Sep 2013 13:25:27 GMT
Connection: keep-alive

どんなアイデアでも大歓迎です!ありがとうございました

解決

まず、私の一日の問題を数秒で解決してくれた Darrel Mirrel に感謝します :) 応答が得られる HttpCompletitionOption を追加して、コードの 1 行を編集するだけで済みました。

HttpResponseMessage response = m_client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead).Result;

オプション ResponseHeaderRead は、メッセージの内容を読み取らずにヘッダーが読み取られるとすぐに操作を終了するようにクライアントに指示します。

4

2 に答える 2

35

HttpCompletionOptions を指定できる SendAsync オーバーロードを使用します。これにより、HttpClient に応答コンテンツ用のバッファーを作成しないように指示できます。

于 2013-09-10T13:54:48.303 に答える