2011-02-11 9 views
6

tengo el siguiente código:aplicación WP7 no sale BeginGetResponse y entra en la función de devolución de llamada

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

      // End the operation 
      Stream postStream = request.EndGetRequestStream(asynchronousResult); 

      //Console.WriteLine("Please enter the input data to be posted:"); 
      //string postData = Console.ReadLine(); 
      string postData = "my data"; 

      // Convert the string into a byte array. 
      byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

      // Write to the request stream. 
      postStream.Write(byteArray, 0, postData.Length); 
      postStream.Close(); 

       // Start the asynchronous operation to get the response 
       IAsyncResult result = 
         (IAsyncResult)request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); 

     } 

     private void GetResponseCallback(IAsyncResult asynchronousResult) 
     { 
      HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 

      // End the operation 
      HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
      Stream streamResponse = response.GetResponseStream(); 
      StreamReader streamRead = new StreamReader(streamResponse); 
      string responseString = streamRead.ReadToEnd(); 
      Console.WriteLine(responseString); 
      // Close the stream object 
      streamResponse.Close(); 
      streamRead.Close(); 

      // Release the HttpWebResponse 
      response.Close(); 
      allDone.Set(); 

      Dispatcher.BeginInvoke((Action)(() => Debug.WriteLine("George"))); 
     } 

Sin embargo, cuando mi código golpea BeginGetResponse nunca sale (y no me alcanzó un punto de interrupción en la función GetResponseCallback). Traté de agregar la llamada a BeginInvoke, pero todavía no ingresé a este método. Este código funciona en una aplicación de consola de Windows; está en Windows Phone 7 que doesn'teorg

¿Alguien puede ver lo que estoy haciendo mal?

Gracias.

+0

no puedo ver donde está creando el HttpWebRequest –

Respuesta

8

Si ha creado HttpWebRequest en el hilo de la interfaz de usuario, entonces asegúrese de no bloquear el hilo de la interfaz de usuario, de lo contrario, puede interbloqueo.

La muestra del escritorio .NET que ha vinculado no está optimizada para la pila de red del teléfono actual. Debería cambiar el código para que cree HttpWebRequest en una cadena de fondo.

+0

Incluso si la llamada fue hecha en la interfaz de usuario de hilo que no le causa que la llamada nunca vuelva. ¿Verdad? –

+0

El subproceso de fondo interno que el tiempo de ejecución creado en su nombre cuando envía la solicitud llama al subproceso que creó el HWR. Si ese hilo está bloqueado, su solicitud web no puede continuar. Es por eso que recomendamos en el teléfono crear sus HWR en un hilo de fondo. De esta forma, nunca afectarán su subproceso de interfaz de usuario. –

3

No veo qué hay de malo en tu código (tal vez sea útil un ejemplo completo de lo que intentas hacer) pero aquí tienes un ejemplo simple de cómo realizar la acción que deseas hacer.
Se publica algunos datos a un URI y luego pasa el repsonse a una función de devolución de llamada:

ejecutar simplemente como esto (el uso de un BackgroundWorker no es necesario, pero se recomienda)

var bw = new BackgroundWorker(); 
bw.DoWork += (o, args) => PostDataToWebService("http://example.com/something", "key=value&key2=value2", MyCallback); 
bw.RunWorkerAsync(); 

Aquí está la función de devolución de llamada se refiere a:
(Usted puede cambiar esto sin embargo es adecuado para sus necesidades.)

public static void MyCallback(string aString, Exception e) 
{ 
    Deployment.Current.Dispatcher.BeginInvoke(() => 
    { 
     if (e == null) 
     { 
      // aString is the response from the web server 
      MessageBox.Show(aString, "success", MessageBoxButton.OK); 
     } 
     else 
     { 
      MessageBox.Show(e.Message, "error", MessageBoxButton.OK); 
     } 
    }); 
} 

Aquí es el método real:

public void PostDataToWebService(string url, string data, Action<string, Exception> callback) 
{ 
    if (callback == null) 
    { 
     throw new Exception("callback may not be null"); 
    } 

    try 
    { 
     var uri = new Uri(url, UriKind.Absolute); 
     var req = HttpWebRequest.CreateHttp(uri); 

     req.ContentType = "application/x-www-form-urlencoded"; 
     req.Method = "POST"; 

     AsyncCallback GetTheResponse = ar => 
      { 
       try 
       { 
        var result = ar.GetResponseAsString(); 

        callback(result, null); 
       } 
       catch (Exception ex) 
       { 
        callback(null, ex); 
       } 
      }; 

     AsyncCallback SetTheBodyOfTheRequest = ar => 
      { 
       var request = ar.SetRequestBody(data); 

       request.BeginGetResponse(GetTheResponse, request); 
      }; 

     req.BeginGetRequestStream(SetTheBodyOfTheRequest, req); 
    } 
    catch (Exception ex) 
    { 
     callback(null, ex); 
    } 
} 

y aquí están los métodos de extensión/ayudante que utiliza:

public static class IAsyncResultExtensions 
{ 
    public static string GetResponseAsString(this IAsyncResult asyncResult) 
    { 
     string responseString; 

     var request = (HttpWebRequest)asyncResult.AsyncState; 

     using (var resp = (HttpWebResponse)request.EndGetResponse(asyncResult)) 
     { 
      using (var streamResponse = resp.GetResponseStream()) 
      { 
       using (var streamRead = new StreamReader(streamResponse)) 
       { 
        responseString = streamRead.ReadToEnd(); 
       } 
      } 
     } 

     return responseString; 
    } 

    public static HttpWebRequest SetRequestBody(this IAsyncResult asyncResult, string body) 
    { 
     var request = (HttpWebRequest)asyncResult.AsyncState; 

     using (var postStream = request.EndGetRequestStream(asyncResult)) 
     { 
      using (var memStream = new MemoryStream()) 
      { 
       var content = body; 

       var bytes = System.Text.Encoding.UTF8.GetBytes(content); 

       memStream.Write(bytes, 0, bytes.Length); 

       memStream.Position = 0; 
       var tempBuffer = new byte[memStream.Length]; 
       memStream.Read(tempBuffer, 0, tempBuffer.Length); 

       postStream.Write(tempBuffer, 0, tempBuffer.Length); 
      } 
     } 

     return request; 
    } 
} 
Cuestiones relacionadas