Adicionando dados a um silverlight HTTP POST Async
-
06-07-2019 - |
Pergunta
Eu estou tentando enviar alguns dados usando um HTTP POST simples no Silverlight 3.0, mas por algum motivo eu não consigo encontrar um bom exemplo de como fazer isso.
Até agora, este obras, mas como faço para enviar alguns dados ao longo w / o pedido?
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
Solução
Você precisa o método BeginGetRequestStream
antes de obter a resposta (nota VB.NET não é a minha língua principal).
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
Parece de sua resposta que o são dados de formulário HTML postagem. Aqui é a maneira correta para criar o corpo da entidade (C # sorry): -
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, em particular, o uso de Uri.EscapeDataString
, esta a maneira correta de valores codificar dados para esta Content-Type. Assume-se que o servidor está esperando codificação de caracteres UTF-8.
Ao converter o resultado desta para uma matriz de bytes pronto para postar você só precisa usar a codificação ASCII a string devolvida só vai conter caracteres dentro do intervalo ASCII.
Outras dicas
A solução final que funcionou é mostrado abaixo. Graças ao @ AnthonyWJones para sua resposta rápida, que me pôs em movimento na direção certa!
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