2013-11-20 9 views
2

Я пишу приложение Windows Phone 8, которое должно отправить запрос GET + POST на сервер и проанализировать ответ.Получение данных обратно из обратного вызова HttpWebRequest.BeginGetResponse

код, я использую, чтобы отправить запрос и получить ответ обратно следующий (написано в отдельном статическом классе):

   // server to POST to 
     string url = "http://myserver.com/?page=hello&param2=val2"; 

     // HTTP web request 
     var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
     httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
     httpWebRequest.Method = "POST"; 

     // Write the request Asynchronously 
     using (var stream = await Task.Factory.FromAsync<Stream>(httpWebRequest.BeginGetRequestStream, 
                   httpWebRequest.EndGetRequestStream, null)) 
     { 
      // Create the post data 
      string postData = "pseudo=pseudo&titre=test&texte=\"Contenu du message\""; 
      byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

      // Write the bytes to the stream 
      await stream.WriteAsync(byteArray, 0, byteArray.Length); 
      stream.Close(); 
      IAsyncResult ar = httpWebRequest.BeginGetResponse(new AsyncCallback(GetResponsetStreamCallback), httpWebRequest); 

     } 



    } 

    private static void GetResponsetStreamCallback(IAsyncResult callbackResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)callbackResult.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(callbackResult); 
     using (StreamReader httpWebStreamReader = new StreamReader(response.GetResponseStream())) 
     { 
      string result = httpWebStreamReader.ReadToEnd(); 
      //For debug: show results 
      System.Diagnostics.Debug.WriteLine(result); 



     } 

Моей проблемы: я не знаю, как верните этот ответ (результат строки) обратно в мой позади код в моем приложении (или любой другой метод в моем приложении, если честно).

Как я мог это сделать?

+0

Я нашел эту статью. Я надеюсь, что это будет полезно для вас. Http://www.codeproject.com/Articles/6554/How-to-use-HttpWebRequest-and-HttpWebResponse-in-N –

ответ

5

Вы можете попробовать следующий код,

string url = "http://myserver.com/?page=hello&param2=val2"; 

    // HTTP web request 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(url); 
    httpWebRequest.ContentType = "application/x-www-form-urlencoded"; 
    httpWebRequest.Method = "POST"; 
    httpWebRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), webRequest); 
    } 

    private void GetRequestStreamCallback(IAsyncResult asynchronousResult) 
    { 
     HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState; 

     using (var postStream = webRequest.EndGetRequestStream(asynchronousResult)) 
     { 
      //send yoour data here 
     } 
     webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest); 
    } 

    void GetResponseCallback(IAsyncResult asynchronousResult) 
    { 

     try 
     { 
      HttpWebRequest myrequest = (HttpWebRequest)asynchronousResult.AsyncState; 
      using (HttpWebResponse response = (HttpWebResponse)myrequest.EndGetResponse(asynchronousResult)) 
      { 
       System.IO.Stream responseStream = response.GetResponseStream(); 
       using (var reader = new System.IO.StreamReader(responseStream)) 
       { 
        data = reader.ReadToEnd(); 
       } 
       responseStream.Close(); 
      } 
     } 
     catch (Exception e) 
     { 
    //Handle Exception 
      } 
      else 
       throw; 
     } 
    } 
0

Должен ли быть статический класс? Потому что, если у вас есть новый объект webrequest для каждого запроса, каждый ответ возвращается в свой собственный объект. V

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

Смотрите также: http://blogs.msdn.com/b/devfish/archive/2011/04/07/httpwebrequest-fundamentals-windows-phone-services-consumption-part-2.aspx

-1

Вы можете: сделать глобальную переменную в App.xaml.cs: результат публичной строки;

В коде использовать его как

(App.Current as App).result = httpWebStreamReader.ReadToEnd(); 

Если вам нужно, чтобы получить уведомление в текущем активной странице, когда результат обновляется - использовать делегаты после получения ответа, который будет сигнализировать на свою страницу.

4
public static string GetPageAsString(Uri address) 
    { 
     string result = ""; 

     // Create the web request 
     HttpWebRequest request = WebRequest.Create(address) as HttpWebRequest; 

     // Get response 
     using (HttpWebResponse response = request.GetResponse() as HttpWebResponse) 
     { 
      // Get the response stream 

      StreamReader reader = new StreamReader(response.GetResponseStream(), Constants.EncodingType); 

      // Read the whole contents and return as a string 
      result = reader.ReadToEnd(); 
     } 

     return result; 
    } 
Смежные вопросы