title: Bidirectional use of Webclient for binary
body: <p><a href="http://msdn.microsoft.com/en-us/library/system.net.webclient%28v=vs.95%29.aspx" rel="nofollow noreferrer">Webclient</a> is used to upload an instruction file (up to 1 MegaByte) to the server an receives this manipulated instruction set as Response (up to 1 MegaByte) as binary data. </p>
  
  <p>I am able to Upload binary and download binary but I am not able to do it with same request/response command. Means, not the same webclient can do this. In that case it looses the reference to the stream which was set on server.</p>
  
  <p><img src="https://i.stack.imgur.com/TC0fH.png" alt="Webclient bidirectional binary example"></p>
  
  <p><strong>How to write AND read binary data in one single sequence?</strong></p>
  
  <p>.</p>
  
  <p><strong>Server script</strong></p>
  
  <pre><code>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
  </code></pre>
  
  <p>.</p>
  
  <p><strong>Client class</strong></p>
  
  <pre><code>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 '&lt;&lt;--- 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 &lt;= 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
  </code></pre>