Альтернатива этому запросу HTTP - PullRequest
0 голосов
/ 09 ноября 2010

У меня есть класс, который перехватывает некоторые данные и возвращает их в виде строки. Пока этот объект работает, имеется вращающаяся иконка, сообщающая пользователю, что работа выполняется. Проблема в том, что код завершается до того, как ответ возвращается. Я воткнул

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

}

Ответы [ 3 ]

1 голос
/ 10 ноября 2010

Я разместил здесь рабочий пример использования WebClient и HttpWebRequest.

WebClient, HttpWebRequest и поток пользовательского интерфейса на Windows Phone 7

Обратите внимание, что последнее предпочтительнее длялюбая нетривиальная обработка, чтобы избежать блокировки пользовательского интерфейса.

Не стесняйтесь повторно использовать код.

1 голос
/ 09 ноября 2010

Собираетесь ли вы в цикл занятости с (while response == null) в потоке пользовательского интерфейса?Асинхронный обратный вызов для HttpRequest будет доставлен в потоке пользовательского интерфейса, поэтому, если вы выполняете цикл в том же потоке, обратный вызов никогда не сможет выполняться.Вам нужно вернуться, чтобы позволить основному циклу сообщений работать, и тогда ваш асинхронный обратный вызов будет доставлен.

Ваша конструкция выше предполагает, что в действительности вы хотите синхронную выборку.Забудьте обратный звонок и просто позвоните FinaliseAsyncRequest внутри ReadFromUrl самостоятельно.Пользовательский интерфейс будет зависать до тех пор, пока запрос не будет завершен, но звучит так, будто вы этого хотите.

0 голосов
/ 09 ноября 2010

Самый простой способ получить строку с веб-сервера - использовать 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();
}

Обратите внимание, что обратный вызов выполняется в потоке пользовательского интерфейса, и поэтому вы должны использовать этот метод только в том случае, если ваш метод обратного вызова не очень эффективен, так как он будет блокировать пользовательский интерфейс во время его выполнения.веб-запрос, то вы можете использовать HttpWebRequest.

Если вам действительно нужно имитировать синхронное поведение, взгляните на Подделка синхронных вызовов в Silverlight WP7

...