2009-10-27 5 views
3

J'essaie d'envoyer des données en utilisant un simple HTTP POST dans Silverlight 3.0 mais pour une raison quelconque, je n'arrive pas à trouver un bon exemple sur la façon de procéder.Ajout de données à un Silverlight HTTP POST Async

Jusqu'à présent, cela fonctionne, mais comment envoyer des données avec la demande?

Public Sub SubmitMessage() 
    request = WebRequestCreator.ClientHttp.Create(New System.Uri("http://localhost:27856/Home.aspx/PostUpdate/")) 
    request.Method = "POST" 

    Dim result As IAsyncResult = request.BeginGetResponse(New AsyncCallback(AddressOf UpdateDone), Nothing) 
End Sub 

Public Sub UpdateDone(ByVal ar As IAsyncResult) 
    Dim response As HttpWebResponse = request.EndGetResponse(ar) 

    Using reader As StreamReader = New StreamReader(response.GetResponseStream()) 
     Dim valid As String = reader.ReadToEnd() 
    End Using 
End Sub 

Répondre

1

Vous devez la méthode BeginGetRequestStream avant d'obtenir la réponse (note VB.NET est pas ma langue principale).

Public Sub SubmitMessage() 
    request = WebRequestCreator.ClientHttp.Create(New System.Uri("http://localhost:27856/Home.aspx/PostUpdate/")) 
    request.Method = "POST" 

    request.BeginGetRequestStream(New AsyncCallback(AddressOf SendData), Nothing) 
End Sub 

Public Sub SendData(ByVal ar As IAsyncResult) 
    Dim stream as Stream = state.Request.EndGetRequestStream(ar) 
    '' # Pump your data as bytes into the stream. 
    stream.Close() 
    request.BeingGetResponse(New AsyncCallback(AddressOf UpdateDone), Nothing) 
End Sub 

Public Sub UpdateDone(ByVal ar As IAsyncResult) 
    Dim response As HttpWebResponse = request.EndGetResponse(ar) 

    Using reader As StreamReader = New StreamReader(response.GetResponseStream()) 
     Dim valid As String = reader.ReadToEnd() 
    End Using 
End Sub 

Il semblerait d'après votre réponse que les données HTML sont affichées. Voici la bonne façon de créer le corps d'entité (C# désolé): -

public static string GetUrlEncodedData(Dictionary<string, string> data) 
    { 
     var sb = new StringBuilder(); 
     foreach (var kvp in data) 
     { 
      if (sb.Length > 0) sb.Append("&"); 
      sb.Append(kvp.Key); 
      sb.Append("="); 
      sb.Append(Uri.EscapeDataString(kvp.Value)); 
     } 
     return sb.ToString(); 
    } 

note en particulier l'utilisation de Uri.EscapeDataString, ce la bonne façon de coder des valeurs de données pour ce type de contenu. Il suppose que le serveur s'attend à un codage de caractères UTF-8. Lorsque vous convertissez le résultat de ceci en un tableau d'octets prêt à être publié, vous n'avez besoin que du codage ASCII car la chaîne retournée ne contient que des caractères dans la plage ASCII.

+0

Directement après la request.BeginGetResponse (... le HTTP POST est fait et il saute à l'adresse mentionnée w/le flôt. De toute façon de joindre ce flux avant cet appel dans la première méthode ci-dessus? –

+0

On dirait une petite faute de frappe dans votre réponse, mais il m'a fait bouger dans la bonne direction! J'ai posté la solution finale pour éclaircir toute confusion autour de cela! Merci pour la réponse! –

+0

Oups, oui je cite la bonne méthode mais n'a pas réussi à réellement – AnthonyWJones

1

La solution finale qui a fonctionné est montrée ci-dessous. Merci à @AnthonyWJones pour sa réponse rapide qui m'a fait bouger dans la bonne direction!

Public Sub SubmitMessage() 
    Dim request As HttpWebRequest = WebRequestCreator.ClientHttp.Create(New System.Uri("http://localhost:27856/Home.aspx/PostUpdate/")) 
    request.Method = "POST" 
    request.ContentType = "application/x-www-form-urlencoded" 

    request.BeginGetRequestStream(New AsyncCallback(AddressOf SendStatusUpdate), request) 
End Sub 

Public Sub SendStatusUpdate(ByVal ar As IAsyncResult) 
    Dim request As HttpWebRequest = DirectCast(ar.AsyncState, HttpWebRequest) 

    Dim stream As Stream = request.EndGetRequestStream(ar) 

    Dim data As New System.Text.UTF8Encoding 
    Dim byteArray As Byte() = data.GetBytes("status=test") 

    stream.Write(byteArray, 0, byteArray.Length) 
    stream.Close() 
    stream.Dispose() 

    request.BeginGetResponse(New AsyncCallback(AddressOf StatusUpdateCompleted), request) 
End Sub 

Public Sub StatusUpdateCompleted(ByVal ar As IAsyncResult) 
    Dim request As HttpWebRequest = DirectCast(ar.AsyncState, HttpWebRequest) 

    Dim response As HttpWebResponse = request.EndGetResponse(ar) 

    Using reader As StreamReader = New StreamReader(response.GetResponseStream()) 
     Dim valid As String = reader.ReadToEnd() 
    End Using 
End Sub 
+0

L'encodage par défaut pour UploadStringAsync est UTF-8, avez-vous essayé d'utiliser cela? En plus de l'émulation de formulaire HTML vrai, cette forme d'encodage est incorrecte.S'il y a une raison pour laquelle vous ne publiez pas quelque chose comme un XML ou JSON? – AnthonyWJones