Bidirectional use of webclient for binary

Webclient is used to upload the instruction file (up to 1 megabyte) to the server, which receives this managed set of commands as a response (up to 1 megabyte) as binary data.

I can upload binaries and upload binaries, but I cannot do this with the same request / response command. So, not the same web client can do this. In this case, it loses the link to the stream that was installed on the server.

Webclient bidirectional binary example

How to write and read binary data in one sequence?

.

Server script

Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest 'Setup data reader If cRead Is Nothing Then cRead = New ReadDataFromContext cRead.Read(context) 'read data from 'context.Request.InputStream' If cWrite Is Nothing Then cWrite = New WriteDataToContext cWrite.Write(context) 'write data to 'context.Response.OutputStream' End Sub 

.

Customer class

 Partial Public Class MainPage Inherits UserControl Private WithEvents WCUpload As WebClient 'Private WithEvents WCDownload As WebClient Private Stream As IO.Stream Dim U As New Uri("http://localhost:51001/communicator.ashx", UriKind.Absolute) Public Sub New() InitializeComponent() WCUpload = New WebClient 'WCDownload = New WebClient End Sub Private Sub btnTest_Click(sender As System.Object, e As System.Windows.RoutedEventArgs) Handles btnTest.Click WCUpload.OpenWriteAsync(U) End Sub 'This methode is never called if using WCUpload (on WCDownload it works but WCDownload has no more data) 'Private Sub WC_OpenReadCompleted(sender As Object, e As System.Net.OpenReadCompletedEventArgs) Handles WCDownload.OpenReadCompleted ' Dim D(e.Result.Length - 1) As Byte ' e.Result.Read(D, 0, D.Length) ' Me.btnTest.Content = System.Text.Encoding.UTF8.GetString(D, 0, D.Length) 'End Sub Private Sub WC_OpenWriteCompleted(sender As Object, e As System.Net.OpenWriteCompletedEventArgs) Handles WCUpload.OpenWriteCompleted Me.Stream = e.Result Dim D() As Byte = System.Text.Encoding.UTF8.GetBytes("Hallo Timo") Me.Stream.Write(D, 0, D.Length) Me.Stream.Close() End Sub Private Sub WC_WriteStreamClosed(sender As Object, e As System.Net.WriteStreamClosedEventArgs) Handles WCUpload.WriteStreamClosed 'WC.OpenReadAsync(U) 'WCDownload.OpenReadAsync(U) Me.Stream.Position = 0 '<<--- ERROR, cannot access to disposed object Dim D(Me.Stream.Length - 1) As Byte Me.Stream.Read(D, 0, D.Length) Me.btnTest.Content = System.Text.Encoding.UTF8.GetString(D, 0, D.Length) End Sub Public Sub PushData(ByVal StreamIn As IO.Stream, ByVal StreamOut As IO.Stream) Dim Buffer(4096 - 1) As Byte Dim BytesRead As Integer On Error Resume Next 'RaiseEvent Progress(Me, 0) Do BytesRead = StreamIn.Read(Buffer, 0, Buffer.Length) If BytesRead <= 0 Then Exit Do StreamOut.Write(Buffer, 0, BytesRead) 'RaiseEvent Progress(Me, StreamOut.Length / StreamIn.Length * 99) 'max 99 to raise the event with 100% Loop 'RaiseEvent Progress(Me, 100) End Sub End Class 
+4
source share
1 answer

It seems to me that you are simply looking for the UploadData method, which sends the body of the byte[] request to the server and returns the body of the byte[] response to the client. Just:

 byte[] req = ...; byte[] resp; using(var client = new WebClient()) { resp = client.UploadData(address, req); } 

Ultimately, http is a request / response protocol, you can execute multiple requests in sequence. If you need more flexibility, I suggest you look at web sockets that allow both ends to send ad-hoc.


To use async in silverlight, try the PCL version for HttpClient - a similar api, but a more complete implementation than silverlight is offered from the box: http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable- httpclient-for-net-framework-and-windows-phone.aspx

+2
source

All Articles