3

我正在尝试在 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
4

2 回答 2

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 范围内的字符。

于 2009-10-27T21:20:00.640 回答
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
于 2009-10-28T15:25:50.960 回答