2009-10-27 2 views
3

Я пытаюсь отправить некоторые данные с помощью простой HTTP POST в Silverlight 3.0, но по какой-то причине я не могу найти хороший пример того, как это сделать.Добавление данных в silverlight HTTP POST Async

До сих пор это работает, но как я могу отправить некоторые данные по запросу?

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, это правильный путь для кодирования значения данных для этого Content-Type. Предполагается, что сервер ожидает кодировку символов UTF-8.

При преобразовании результата этого в массив байтов, готовый для публикации, вам нужно использовать только кодировку ASCII, поскольку возвращаемая строка будет содержать только символы в диапазоне ASCII.

+0

Непосредственно после request.BeginGetResponse (... СТОЛБ HTTP делается, и переходит к URL упомянутого ж/из приложенного потока. В любом случае, чтобы прикрепить этот поток до этого вызова в первом методе выше? –

+0

Похоже на небольшую опечатку в вашем ответе, но это заставило меня двигаться в правильном направлении! Я отправил окончательное решение, чтобы устранить любую путаницу вокруг этого! Спасибо за ответ! –

+0

К сожалению, я цитирую правильный метод, но не смог на самом деле теперь можно настроить код с его помощью. – AnthonyWJones

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

Смежные вопросы