解决:可用于完成套接字连接启动的winsock资源不足

时间:2013-03-23 20:28:47

标签: vb.net web-services iis

我有两个系统,一个是通过Web服务发送大量数据(大约1GB)。首先,它将数据拆分为块,然后在请求时使用额外信息将其发送到客户端。

数据不是直接以字节数组的形式发送,而是放在我创建的具有两个成员的特殊类中:

1)消息:我使用它指定如何处理块 2)Obj:表示数据的字节数组

所以基本上服务器填充这个结构然后它序列化整个对象,最后将它发送到客户端。每个块大约是4KB

这再次重复多次,因此数据传输量可能是1GB或2GB。当我尝试运行时,我收到此错误:

捕获了System.InsufficientMemoryException   消息="可用于完成套接字连接启动的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

你会收到这个错误。希望有人有解决方案。

1 个答案:

答案 0 :(得分: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