2009-11-16 9 views
3

J'utilise HttpWebRequest pour publier des données sur un serveur Web à la lumière d'argent 3.0, voici mon codeHttpWebRequest.EndGetRequestStream question dans Silverlight

public void MakePostRequest() 
    { 


      // Create a new HttpWebRequest object. 

     HttpWebRequest request = (HttpWebRequest)WebRequest.Create("http://www.mywebsite.com/somepage.php");  

      // Set the ContentType property. 
      request.ContentType="application/x-www-form-urlencoded"; 
      // Set the Method property to 'POST' to post data to the URI. 
      request.Method = "POST"; 

      // Start the asynchronous operation.  
      request.BeginGetRequestStream(new AsyncCallback(ReadCallback), request);  

      // Keep the main thread from continuing while the asynchronous 
      // operation completes. A real world application 
      // could do something useful such as updating its user interface. 
      allDone.WaitOne(); 

      // Get the response. 

      request.BeginGetResponse(new AsyncCallback(ResponseCallback), request);  
    } 


    private static void ResponseCallback(IAsyncResult asynchronousResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
     HttpWebResponse resp = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
     Stream streamResponse = resp.GetResponseStream(); 
     StreamReader streamRead = new StreamReader(streamResponse); 
     string responseString = streamRead.ReadToEnd(); 
     Console.WriteLine(responseString); 
     // Close the stream object. 
     streamResponse.Close(); 
     streamRead.Close(); 

     // Release the HttpWebResponse. 
     resp.Close(); 
    } 

    private static void ReadCallback(IAsyncResult asynchronousResult) 
    {  
      IDictionary<string, string> objDictionary = new Dictionary<string, string>(); 
      objDictionary.Add("action", "login"); 
      objDictionary.Add("login", "[email protected]"); 
      objDictionary.Add("password", "pass123"); 


      HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
      // End the operation. 
      // This line of code making the blocking call??? 
      Stream postStream = request.EndGetRequestStream(asynchronousResult); 

     string boundary = "----------------------------" + DateTime.Now.Ticks.ToString("x"); 

      Stream memStream = new System.IO.MemoryStream(); 

      byte[] boundarybytes = System.Text.Encoding.UTF8.GetBytes("\r\n--" + boundary + "\r\n"); 

      string formdataTemplate = "\r\n--" + boundary + "\r\nContent-Disposition: form-data; name=\"{0}\";\r\n\r\n{1}"; 

      foreach (KeyValuePair<string, string> entry in objDictionary) 
      { 
       string key = entry.Key; 
       string value = entry.Value; 
       string formitem = string.Format(formdataTemplate, key, value); 
       byte[] formitembytes = System.Text.Encoding.UTF8.GetBytes(formitem); 
       memStream.Write(formitembytes, 0, formitembytes.Length); 
      } 

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



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

     //Writing the name value pair 
     postStream.Write(tempBuffer, 0, tempBuffer.Length); 

     memStream.Close(); 
     postStream.Close(); 

} 

Le problème que je suis face est que la ligne Stream postStream = request.EndGetRequestStream(asynchronousResult); fait quelques appels de blocage , et l'ensemble de mon application semble être pendu .. Cependant, je peux ouvrir la même page Web à partir du navigateur ... Pourquoi il en est ainsi?

Répondre

0

Il semble que ce n'est pas tout votre code car il y a ceci:

allDone.WaitOne(); 

Ce serait la source de l'appel de blocage le plus probable. Retirez votre utilisation de la poignée d'attente allDone.

3

Au lieu de cela, déplacez votre appel vers BeginGetResponse jusqu'à la fin de la méthode ReadCallback. En effet, vous enchaînez les appels: -

BeginGetRequest->ReadCallback->BeginGetResponse->ResponseCallback 

BTW, vous utilisez un type de contenu "application/x-www-form-urlencoded". Cependant, il semble que vous essayiez de coder un corps d'entité Multipart, auquel cas votre type de contenu devrait être "multipart/form-data".

0

Si tout ce que vous voulez faire est la collecte de paires POST et nom/valeur sur le serveur, utilisez simplement WebClient. En deux lignes de code, vous pouvez réaliser ce que vous voulez.

Bien sûr, il ne vous donnera pas un contrôle précis, comme la possibilité d'implémenter async, mais à la fin, il fera le travail.

+0

pouvez-vous me faire savoir les deux lignes de code pour l'envoi de données à l'URL dans Silverlight? –

0

semble ou pourrait l'être, vous allez avoir accès à une URL qui nécessite une 'autorisation'. Le navigateur Web stocke «cookie» ou tout pour résider votre autorisation d'accès, mais votre application ne le sont pas. Une fois que vous vous connectez à cette URL à l'aide du navigateur, vous obtenez cette autorisation d'accès uniquement pour votre application de navigateur et vous ne pouvez pas la dériver vers une autre application.

Questions connexes