0

我有一个类可以抓取一些数据并将其作为字符串返回。当这个对象工作时,会有一个旋转图标让用户知道工作正在完成。问题是代码在响应返回之前退出。我卡了一个

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));
        }
    }

}
4

3 回答 3

1

(while response == null)您是否正在进入UI 线程上的繁忙循环?的异步回调HttpRequest将在 UI 线程上传递,因此如果您在同一线程上循环,则回调将永远无法运行。您需要返回以允许主消息循环运行,然后您的异步回调将被传递。

您上面的设计表明您真正想要的是同步获取。忘记回调,只在自己FinaliseAsyncRequest内部调用。ReadFromUrlUI 将挂起,直到请求完成,但听起来这就是您想要的。

于 2010-11-09T17:22:39.897 回答
1

我在这里发布了一个使用 WebClient 和 HttpWebRequest 的工作示例。

Windows Phone 7 上的 WebClient、HttpWebRequest 和 UI 线程

请注意,后者对于任何重要的处理都是首选,以避免阻塞 UI。

随意重用代码。

于 2010-11-10T00:50:20.197 回答
0

从 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 线程上执行,因此您应该仅在您的回调方法没有做太多事情时才使用此方法,因为它会在执行时阻塞 UI。

如果您需要对 Web 请求进行更多控制,则可以使用 HttpWebRequest。

如果您真的必须模仿同步行为,请查看Silverlight WP7 中的 Faking 同步调用

于 2010-11-09T20:16:21.827 回答