3

私は2つのシステムを持っています。1つはWebサービスを介して大量のデータ(約1GB)を送信しています。まず、データをチャンクに分割し、追加情報が要求されたときにクライアントに送信します。

データはバイト配列として直接送信されるのではなく、2つのメンバーを持つ私が作成した特別なクラスに配置されます。

1)メッセージ:チャンクをどうするかを指定するために使用します2)Obj:データを表すバイト配列

したがって、基本的にサーバーはこの構造を埋め、オブジェクト全体をシリアル化し、最後にクライアントに送信します。各チャンクは約4KBです

繰り返しますが、これは何度も繰り返されるため、データ転送量は1GBまたは2GBになる可能性があります。これを実行しようとすると、次のエラーが発生します。

System.InsufficientMemoryExceptionがキャッチされましたMessage="ソケット接続の開始を完了するために使用できるwinsockリソースが不足しています。"

私が試したとき:netstat -an -p TCP

私はこのようなものを手に入れました...

TCP 127.0.0.1:58759 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58760 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58761 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58762 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58763 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58764 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58765 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:58766 127.0.0.1:57469 TIME_WAIT

..。

約まで増加:

..。

TCP 127.0.0.1:65531 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:65532 127.0.0.1:57469 TIME_WAIT

TCP 127.0.0.1:65533 127.0.0.1:57469 TIME_WAIT

以前の回答では、これに対するホットフィックスがあるはずですが、機能しませんでした。ホットフィックスはここにあります:

http://support.microsoft.com/kb/2577795

以前は同様のコードを使用していましたが、シリアル化を行う代わりに、データをバイトの配列として直接送信しただけで、完全に正常に機能しました。作成したカプセル化クラスの使用とシリアル化プロセスを除いて、コードに違いはありません。

誰かが私が間違っていることを説明できますか?

ありがとうございました。

===========================================

この問題を再現する簡単な方法を見つけました。

次の方法を持つVB.NETWebサービスを作成することから始めます。

<WebMethod(enablesession:=False)> _
Public Function HelloWorld() As Byte()
    Dim B(0 To 1000) As Byte
    Return B
End Function

次に、次のようにクライアントを作成します。

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Dim T As New ServiceReference1.Service1SoapClient
    T.Open()
    Dim I As Integer
    For I = 0 To 1000000
        T.HelloWorld()
        Me.Text = I
        Application.DoEvents()
    Next
End Sub

このエラーが発生します。誰かがこれに対する解決策を持っていることを願っています。

4

1 に答える 1

0

呼び出しの間にクライアントを閉じる/破棄してみてください。

For I as Integer = 0 To 1000000 Using T As New ServiceReference1.Service1SoapClient T.Open() T.HelloWorld() Me.Text = I End Using Application.DoEvents() Next

于 2015-08-31T16:37:18.153 に答える