C# 此Http请求的替代方案

C# 此Http请求的替代方案,c#,windows-phone-7,windows-phone,C#,Windows Phone 7,Windows Phone,我有一个类,它去获取一些数据并将其作为字符串返回。当这个对象工作时,有一个旋转图标,让用户知道工作正在完成。问题是代码在响应返回之前退出。我贴了一张 while(response == null) 我只是想看看发生了什么事 response = (HttpWebResponse)request.EndGetResponse(AsyncResult); 他没有开火。它在控制台应用程序中触发ok,因此我将其归结为silverlight不喜欢的操作,以下是完整代码: public class Ht

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

while(response == null)
我只是想看看发生了什么事

response = (HttpWebResponse)request.EndGetResponse(AsyncResult);
他没有开火。它在控制台应用程序中触发ok,因此我将其归结为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));
        }
    }

}

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


上面的设计表明,您真正想要的是同步获取。忘记回调,自己调用
finalieasyncrequest
inside
ReadFromUrl
。UI将一直挂起,直到请求完成,但听起来这正是您想要的。

从web服务器获取字符串的最简单方法是使用
WebClient.DownloadStringAsync()
()

试着这样做:

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


如果您真的必须模仿同步行为,请看一看

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

注意:对于任何非琐碎的处理,最好使用后者,以避免阻塞UI


您可以随意重用代码。

Hmm挂起也可以停止任何“等待”的图形或我的操作。我想我需要重新设计。我只是不知道如何继续应用程序所需的数据。来自
HttpWebRequest
的回调不会在UI线程上执行
WebClient
在UI线程上触发它的回调。我对答案感到困惑,他怎么能从ReadFromUrl内部调用FinalizeAsyncRequest?请求永远不会被拒绝,对吗?我试图通过从发出请求的方法返回一个值来完成同样的事情。