我有两个系统,一个是通过网络服务发送大量数据(大约 1GB)。首先,它将数据分成块,然后在请求时将其发送给客户端,并提供额外的信息。
数据不直接作为字节数组发送,而是放入我创建的具有两个成员的特殊类中:
1) 消息:我使用它指定如何处理块 2) Obj:表示数据的字节数组
所以基本上服务器填充这个结构然后它序列化整个对象,最后将它发送给客户端。每个块大约 4KB
再次重复多次,因此数据传输量可能是 1GB 或 2GB。当我尝试运行它时,我收到此错误:
System.InsufficientMemoryException 被捕获 Message="Insufficient 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.NET Web 服务:
<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
你会得到这个错误。希望有人对此有解决方案。