我有一个类去抓取一些数据并将其作为字符串返回。当这个对象工作时,有一个旋转的图标让用户知道正在完成的工作。问题是在响应返回之前代码退出。我卡住了
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));
}
}
}
答案 0 :(得分:1)
你是否在UI线程上使用(while response == null)
进入忙碌循环? HttpRequest
的异步回调将在UI线程上传递,因此如果您在同一个线程上循环,则回调永远不会运行。您需要返回以允许主消息循环运行,然后您的异步回调将被传递。
上面的设计表明你真正想要的是同步提取。忘记回调,然后自己在FinaliseAsyncRequest
内调用ReadFromUrl
。 UI将一直挂起,直到请求完成,但听起来就像你想要的那样。
答案 1 :(得分:1)
我在这里发布了一个使用WebClient和HttpWebRequest的工作示例。
WebClient, HttpWebRequest and the UI Thread on Windows Phone 7
请注意,后者是任何非平凡处理的首选,以避免阻止UI。
随意重复使用代码。
答案 2 :(得分:0)
从Web服务器获取字符串的最简单方法是使用WebClient.DownloadStringAsync()
(MSDN docs)。
尝试这样的事情:
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线程上执行,所以如果你的回调方法做得不多,你应该只使用这个方法,因为它会在执行时阻止UI。
如果您需要更多地控制Web请求,那么您可以使用HttpWebRequest。
如果您真的必须模仿同步行为,请查看Faking synchronous calls in Silverlight WP7