2011-07-12 17 views
2

私のコードでHttpWebRequest.BeginGetResponse()メソッドを呼び出して私のサーバーからデータを取得しています。サーバーは、数KBから数GBの範囲のコンテンツを生成します。HttpWebRequest.BeginGetResponseが完了しました。

私の問題は、HttpWebRequest.BeginGetResponseが完了していないことです。サーバーへの接続が確立され、HTTPヘッダーが受信された直後に完了します。ここで

は、GETメソッドを使用してサンプルコードです:

public bool StartDownload() 
{ 
    try 
    { 
     HttpWebRequest myHttpWebRequest = (HttpWebRequest)WebRequest.Create(m_getUrl); 
     myHttpWebRequest.Method = "GET"; 

     // Start the asynchronous request. 
     m_requestState = new RequestState(); 
     m_requestState.request = myHttpWebRequest; 

     myHttpWebRequest.BeginGetResponse(new AsyncCallback(ResponseCompleted), m_requestState); 
    } 
    catch (Exception) 
    { 
     m_requestState = null; 
    } 

    return m_requestState != null; 
} 

private void ResponseCompleted(IAsyncResult result) 
{ 
    RequestState myRequestState = (RequestState)result.AsyncState; 
    HttpWebRequest myHttpWebRequest = myRequestState.request; 

    m_logger.LogMessage("ResponseCompleted notification received!"); 

    HttpWebResponse response = null; 
    try 
    { 
     response = (HttpWebResponse)myHttpWebRequest.EndGetResponse(result); 
    } 
    catch (Exception) 
    { 
    } 
    ....... 
} 

私は「http://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.39.1を使用してコードを実行します.tar.bz2 "と表示され、結果は次のようになります。

hh:mm:ss.ms 
12:51:30.9440000 - Download started! 
12:53:04.8520000 - ResponseCompleted notification received! 
12:53:04.8560000 - Header received! 
12:53:04.8570000 - DataReceived: 524288 bytes 
......................................... 
12:53:04.8940000 - DataReceived: 78818 bytes 
12:53:04.8940000 - Request data received! 
12:53:04.8940000 - Received bytes: 76100578 

問題はログで簡単に検出できます。接続に1分以上を費やすことはできず、約72.5 MBをダウンロードするのに38ミリ秒を費やすことはできません。 データは電話のどこかにダウンロードされ、完全なコンテンツがローカルで利用可能な場合にのみRequestComplete通知がアプリケーションに送信されるようです。これは、私が操作の進捗状況を示す必要があるため、私にとっては問題ではありません。

WP7用のデバイスとエミュレータ(WP7.1でも同じ)が得られます。

Windowsデスクトップで同じコードを実行すると、正しく実行されます。要求は1秒以内に完了し、残りのダウンロードには約1〜2分かかります。

WP7またはWP 7.1のソリューションはありますか? HTTPヘッダーとコンテンツを完全に制御する必要があるため、新しく導入されたWP 7.1 API「バックグラウンドファイル転送」は役に立ちません。サーバーに対して行うすべてのHTTP要求が出力としてファイルを生成するわけではありません。

ありがとうございました!
Mihai

答えて

3

データをストリーミングする場合は、応答バッファリングを無効にする必要があります。これを行うには、AllowReadStreamBufferingfalseに設定します。

HttpWebRequest myHttpWebRequest = WebRequest.CreateHttp(m_getUrl); 
myHttpWebRequest.Method = "GET"; 
myHttpWebRequest.AllowReadStreamBuffering = false; 
+0

ありがとう、リチャード! – Mihai

+0

もう1つ質問があります。これは、ストリームリードキャンセルに関連しています。私は 'http://stackoverflow.com/questions/6679480/how-to-cancel-reading-from-a-stream-obtained-using-httpwebresponse-getresponsestr'に投稿しました。ありがとう! – Mihai

関連する問題