2009-10-27 47 views
3

我想在Silverlight 3.0中使用简单的HTTP POST发送一些数据,但出于某种原因,我似乎无法找到一个关于如何执行此操作的好例子。将数据添加到Silverlight HTTP POST异步

到目前为止这个工作,但我怎么发送一些数据沿请求?

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 

回答

1

你需要得到响应之前BeginGetRequestStream方法(注意VB.NET是不是我的主要语言)。

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 

这似乎从你的回答是,张贴HTML表单数据。下面是创建实体主体(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(); 
    } 

请特别注意,使用Uri.EscapeDataString,这种正确的方式对数据进行编码值这个内容类型。它假定服务器正在期待UTF-8字符编码。

将此结果转换为准备发布的字节数组时,只需使用ASCII编码,因为返回的字符串将只包含ASCII范围内的字符。

+0

的request.BeginGetResponse(...后直接HTTP POST完成并跳转到所提到W上的网址输入/输出流连接。任何方式这个调用上述第一个方法之前附加此流? – 2009-10-28 14:02:43

+0

看起来像在你的答案小错字,但它让我朝着正确的方向移动!我发布了最终的解决方案,以清除任何混乱这一点!感谢您的答复! – 2009-10-28 15:13:01

+0

哎呀,是的,我引用正确的方法,但没有实际 – AnthonyWJones 2009-10-28 22:28:29

1

工作的最终解决方案如下所示。感谢@AnthonyWJones他的快速回答让我朝着正确的方向前进!

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

UploadStringAsync的默认编码是UTF-8,您是否尝试过使用它?除了真正的HTML表单模拟,这种编码形式不正确。是否有理由不发布类似于XML的内容或JSON? – AnthonyWJones 2009-10-28 22:35:54