2012-03-26 8 views
0

J'essaie d'utiliser HttpWebRequest sur une application WP7, mais j'ai un problème. Je ne reçois jamais une réponse du serveur:/HttpWebRequest ne répond pas

Qu'est-ce que je fais mal?

Voici la paix code défectueux ...

Util Classe

public class RequestState 
{ 
    // This class stores the State of the request. 
    const int BUFFER_SIZE = 1024; 
    public string requestData; 
    public byte[] Data 
    { 
     get 
     { 
      ASCIIEncoding ascii = new ASCIIEncoding(); 
      byte[] encodedPostData = ascii.GetBytes(this.requestData); 

      return encodedPostData; 
     } 
    } 
    public byte[] BufferRead; 
    public HttpWebRequest request; 
    public HttpWebResponse response; 

    public RequestState() 
    { 
     BufferRead = new byte[BUFFER_SIZE]; 
     requestData = string.Empty; 
     request = null; 
    } 
} 

La méthode ...

private static ManualResetEvent allDone = new ManualResetEvent(false); 
private static string PostRequest(string service, string email, string password, string source) 
    { 
     // Prepare request. 
     HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(clientLoginUrl); 
     request.Method = "POST"; 
     request.ContentType = "application/x-www-form-urlencoded"; 

     // Create an instance of the RequestState and assign the previous myHttpWebRequest1 
     // object to it's request field. 
     RequestState myRequestState = new RequestState(); 
     myRequestState.request = request; 
     myRequestState.requestData = String.Format(postData, service, email, password, source); 

     // Get the response that will contain the Auth token. 
     try 
     { 
      request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), myRequestState); 
     } 
     catch (WebException ex) 
     { 
      HttpWebResponse faultResponse = ex.Response as HttpWebResponse; 
      if (faultResponse != null && faultResponse.StatusCode == HttpStatusCode.Forbidden) 
       throw new IncorrectUsernameOrPasswordException(faultResponse.StatusCode, faultResponse.StatusDescription); 
      else 
       throw; 
     } 

     // Keep the main thread from continuing while the asynchronous 
     allDone.WaitOne(); 

     if (myRequestState.response != null) 
     { 
      // Check for login failed. 
      if (myRequestState.response.StatusCode != HttpStatusCode.OK) 
       throw new LoginFailedException(myRequestState.response.StatusCode, myRequestState.response.StatusDescription); 

      // Read. 
      using (StreamReader reader = new StreamReader(myRequestState.response.GetResponseStream())) 
       return reader.ReadToEnd(); 
     } 
     else 
      return string.Empty; 
    } 

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

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

     // Write to the request stream. 
     postStream.Write(requestState.Data, 0, requestState.requestData.Length); 
     postStream.Close(); 

     // Start the asynchronous operation to get the response 
     request.BeginGetResponse(new AsyncCallback(GetResponseCallback), requestState); 
    } 
    private static void GetResponseCallback(IAsyncResult asynchronousResult) 
    { 
     RequestState requestState = (RequestState)asynchronousResult.AsyncState; 
     HttpWebRequest request = (HttpWebRequest)requestState.request; 

     // End the operation 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
     requestState.response = response; 

     allDone.Set(); 
    } 
+0

Je fais ce genre de chose tout le temps, mais je ne bloque jamais le fil de l'interface utilisateur. Ma suggestion est d'essayer de le faire sur un fil séparé et de voir si vous obtenez une réponse - il se peut que quelque chose essaie d'entrer dans le fil de l'interface utilisateur (mais ne sais pas quoi) et vous bloque de remplir votre demande. –

+0

Pourriez-vous donner du code s'il vous plaît? – rpf

+1

Il suffit de prendre le code tel qu'il est et de l'exécuter via System.Threading.ThreadPool.QueueUserWorkItem() –

Répondre

0

Avez-vous essayé faire une demande de plusieurs sites différents sans chance ?

J'ai également eu ce problème, et c'est parce que j'ai manqué certaines options d'en-tête à la demande. Essayez de télécharger un plugin pour etc Mozilla qui peut renifler votre demande du navigateur vers le site Web, puis ajouter ces en-têtes de la demande à vos en-têtes dans le HttpWebRequest.