私は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
このエラーが発生します。誰かがこれに対する解決策を持っていることを願っています。