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