Question

J'essaie d'envoyer des données à l'aide d'un simple HTTP POST dans Silverlight 3.0 mais, pour une raison quelconque, je ne trouve pas le bon exemple pour savoir comment procéder.

Jusqu'à présent, cela fonctionne, mais comment puis-je 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
Était-ce utile?

La solution

Vous avez besoin de la méthode BeginGetRequestStream avant d'obtenir la réponse (notez que VB.NET n'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

D'après votre réponse, il semblerait qu'ils publient des données de formulaire HTML. Voici la bonne façon de créer le corps d'entité (désolé C #): -

    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();
    }

Notez en particulier l'utilisation de Uri.EscapeDataString , ceci est le moyen correct de coder les valeurs de données pour ce type de contenu. Il suppose que le serveur attend le codage de caractères UTF-8.

Lorsque vous convertissez le résultat obtenu en un tableau d'octets prêt pour la publication, vous devez uniquement utiliser le codage ASCII car la chaîne renvoyée ne contiendra jamais que des caractères compris dans la plage ASCII.

Autres conseils

La solution finale qui a fonctionné est présentée ci-dessous. Merci à @ AnthonyWJones pour sa réponse rapide qui m'a permis d'avancer 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top