【问题标题】:Adding data to a silverlight HTTP POST Async将数据添加到 silverlight HTTP POST 异步
【发布时间】:2009-10-27 19:51:04
【问题描述】:

我试图在 Silverlight 3.0 中使用简单的 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

【问题讨论】:

    标签: silverlight silverlight-3.0 http-post


    【解决方案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 的使用,这是为这个Content-Type 编码数据值的正确方法。它假定服务器需要 UTF-8 字符编码。

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

    【讨论】:

    • 在 request.BeginGetResponse(... http POST 完成后直接跳转到没有附加流的情况下的 url。在第一种方法中在此调用之前附加此流的任何方式上面?
    • 您的答案中看起来像是一个小错字,但它让我朝着正确的方向前进!我发布了最终解决方案以消除对此的任何困惑!感谢您的回复!
    • 哎呀,是的,我引用了正确的方法,但实际上并没有用它来调整代码,现在完成了。
    【解决方案2】:

    有效的最终解决方案如下所示。感谢@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
    

    【讨论】:

    • UploadStringAsync 的默认编码是 UTF-8,你用过吗?除了真正的 HTML 表单模拟之外,这种形式的编码是不正确的。您是否有理由不发布 XML 或 JSON 之类的内容?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 1970-01-01
    • 2017-07-24
    • 1970-01-01
    • 1970-01-01
    • 2016-12-27
    • 1970-01-01
    相关资源
    最近更新 更多