2009-11-16 2 views
3

Я использую HTTPWebRequest для отправки данных на веб-сервер в серебряном свете 3.0, вот мой кодHttpWebRequest.EndGetRequestStream вопрос в 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(); 

} 

Проблема я столкнулся в том, что линия Stream postStream = request.EndGetRequestStream(asynchronousResult); делает некоторые блокировки вызова , и все мое приложение, кажется, повешено. Однако я могу открыть одну и ту же веб-страницу из браузера ... Почему это так?

ответ

0

кажется, что это не весь код, так как есть это:

allDone.WaitOne(); 

Это будет источником вашей блокировки вызова наиболее вероятно.

3

Удалите использование рукоятки ожидания. allDone. Вместо этого переведите свой вызов на BeginGetResponse в конец метода ReadCallback. В результате вы приковать звонки: -

BeginGetRequest->ReadCallback->BeginGetResponse->ResponseCallback 

BTW, Вы используете Content-тип "приложения/х-WWW-форме-urlencoded". Однако вы пытаетесь закодировать тело объекта Multipart, и в этом случае ваш тип контента должен быть «multipart/form-data».

0

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

Конечно, это не даст вам мелкозернистый контроль, например, возможность реализовать асинхронный режим, но в итоге он выполнит свою работу.

+0

, пожалуйста, сообщите мне две строки кода для отправки данных по URL-адресу в Silverlight? –

0

похоже или может быть, вы получите доступ к URL-адресу, для которого требуется «разрешение». В веб-браузере хранится «cookie» или любое из них для вашего разрешения на доступ, но ваше приложение не является. После того, как вы получите доступ к этому URL-адресу с помощью браузера, вы получите это разрешение доступа только для своего приложения-браузера и не можете получить другое приложение.

Смежные вопросы