Aggiunta di dati a un HTTP POST asincrono silverlight
-
06-07-2019 - |
Domanda
Sto provando a inviare alcuni dati utilizzando un semplice POST HTTP in Silverlight 3.0 ma per qualche motivo non riesco a trovare un buon esempio su come farlo.
Finora funziona, ma come posso inviare alcuni dati insieme alla richiesta?
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
Soluzione
È necessario il metodo BeginGetRequestStream
prima di ottenere la risposta (notare che VB.NET non è la mia lingua 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
Dalla tua risposta sembrerebbe che i dati dei moduli HTML vengano pubblicati. Ecco il modo corretto di creare il corpo dell'entità (scusa 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();
}
Nota in particolare l'uso di Uri.EscapeDataString
, questo è il modo corretto di codificare i valori dei dati per questo Content-Type. Presuppone che il server si aspetti la codifica dei caratteri UTF-8.
Quando si converte il risultato di questo in un array di byte pronto per la pubblicazione, è necessario utilizzare solo la codifica ASCII poiché la stringa restituita conterrà sempre caratteri all'interno dell'intervallo ASCII.
Altri suggerimenti
La soluzione finale che ha funzionato è mostrata di seguito. Grazie a @ AnthonyWJones per la sua rapida risposta che mi ha fatto muovere nella giusta direzione!
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