4

Webclientを使用して命令ファイル (最大 1 メガバイト) をサーバーにアップロードし、この操作された命令セットを応答 (最大 1 メガバイト) としてバイナリ データとして受信します。

バイナリのアップロードとバイナリのダウンロードはできますが、同じ要求/応答コマンドでは実行できません。つまり、同じ Web クライアントでこれを実行できるわけではありません。その場合、サーバーに設定されたストリームへの参照が失われます。

Webclient 双方向バイナリの例

単一のシーケンスでバイナリデータを読み書きする方法は?

.

サーバースクリプト

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

.

クライアントクラス

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

1 に答える 1

2

サーバーにリクエストボディを送信し、クライアントにレスポンスボディを返すUploadDataメソッドを探しているだけのように思えます。次のように単純です。byte[]byte[]

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

最終的に、http は要求/応答プロトコルです。ただし、複数の要求を順番に実行できます。さらに柔軟性が必要な場合は、両端でアドホックに送信できる Web ソケットを検討することをお勧めします。


Silverlight での非同期の使用については、HttpClient の PCL バージョンを試してください。API は似ていますが、Silverlight がすぐに提供するよりも完全な実装です: http://blogs.msdn.com/b/bclteam/archive/2013/02/18/portable -httpclient-for-net-framework-and-windows-phone.aspx

于 2013-04-12T22:37:51.287 に答える