このHTTPリクエストに代わるもの
-
30-09-2019 - |
質問
私はいくつかのデータをつかみ、文字列として返すクラスを持っています。このオブジェクトが機能している間、回転するアイコンがあり、ユーザーに作業が行われていることを知らせます。問題は、応答が戻る前にコードが終了することです。私は立ち往生しました
while(response == null)
何が起こっているのかを見るためだけに
response = (HttpWebResponse)request.EndGetResponse(AsyncResult);
発砲していません。コンソールアプリケーションでは問題が発生しているので、Silverlightが好きではないことを私がやっていることにこれを置いています。
public class HttpWorker
{
private HttpWebRequest request;
private HttpWebResponse response;
private string responseAsString;
private string url;
public HttpWorker()
{
}
public string ReadFromUrl(string Url)
{
url = Url;
request = (HttpWebRequest)WebRequest.Create(url);
request.CookieContainer = new CookieContainer();
request.AllowAutoRedirect = true;
request.UserAgent = "Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5.0.6";
AsyncRequest(); // The Demon!
return responseAsString;
}
private void AsyncRequest()
{
request.BeginGetResponse(new AsyncCallback(FinaliseAsyncRequest), null);
}
private void FinaliseAsyncRequest(IAsyncResult AsyncResult)
{
response = (HttpWebResponse)request.EndGetResponse(AsyncResult);
if (response.StatusCode == HttpStatusCode.OK)
{
// Create the stream, encoder and reader.
Stream responseStream = response.GetResponseStream();
Encoding streamEncoder = Encoding.UTF8;
StreamReader responseReader = new StreamReader(responseStream, streamEncoder);
responseAsString = responseReader.ReadToEnd();
}
else
{
throw new Exception(String.Format("Response Not Valid {0}", response.StatusCode));
}
}
}
解決
一緒に忙しいループに入っていますか (while response == null)
UIスレッドで?の非同期コールバック HttpRequest
UIスレッドで配信されるため、同じスレッドでループしている場合、コールバックは実行できません。メインメッセージループを実行するために戻る必要があり、その後、非同期コールバックが配信されます。
上記のデザインは、あなたが本当に望んでいるのはとにかく同期フェッチであることを示唆しています。コールバックを忘れて電話してください FinaliseAsyncRequest
中身 ReadFromUrl
あなた自身。 UIはリクエストが完了するまでハングアップしますが、それはあなたが望むもののように聞こえます。
他のヒント
ここに、WebClientとHTTPWEBREQUESTを使用して作業サンプルを投稿しました。
WebClient、httpwebRequest、およびWindowsPhone7のUIスレッド
注意してください。UIのブロックを避けるために、後者は些細な処理ではない場合が優先されます。
コードを自由に再利用してください。
Webサーバーから文字列を取得する最も簡単な方法は、使用することです WebClient.DownloadStringAsync()
(MSDNドキュメント).
このようなことを試してみてください:
private void DownloadString(string address)
{
WebClient client = new WebClient();
Uri uri = new Uri(address);
client.DownloadStringCompleted += DownloadStringCallback;
client.DownloadStringAsync(uri);
StartWaitAnimation();
}
private void DownloadStringCallback(object sender, DownloadStringCompletedEventArgs e)
{
// Do something with e.Result (which is the returned string)
StopWaitAnimation();
}
コールバックはUIスレッドで実行されるため、コールバックメソッドが実行中にブロックされるため、コールバックメソッドがあまり実行されていない場合にのみこのメソッドを使用する必要があることに注意してください。
Webリクエストをさらに制御する必要がある場合は、httpwebrequestを使用できます。
あなたが本当に同期的な動作を模倣しなければならないなら シルバーライトWP7での同期コールを偽造します