小编dbr*_*ovi的帖子

winsock资源不足

我们有ac #web服务和客户端,都是在Visual Studio 2008中创建的(新项目 - > ASP.Net Web服务应用程序).服务托管在Windows Server 2012 R2,IIS 8.5上.

当客户端将数据发送到我们的服务时,我们将其转发给第三方服务,将结果保存到数据库并将其返回给客户端.

问题是,在极少数情况下,当我们的服务负载很重(每秒许多请求)时,它会开始抛出'不足的winsock资源来完成套接字连接启动'.

我们发现我们的Web服务正在打开许多与第三方服务的TCP连接,并使它们处于TIME_WAIT状态.当此类连接的数量达到较高数量(大约17000)时,整个服务器将无法建立任何新连接.从远程桌面到互联网浏览器的一切都停止工作.这持续几分钟,然后,当Windows开始关闭这些连接时,它会恢复正常.

为了与第三方服务进行通信,我们的服务在其整个生命周期中仅使用一个SoapClient实例.它是在初始化时创建的,永远不会被关闭或销毁; 永远不会创建新实例.

BLIND.BLINDSoapClient client = new BLIND.BLINDSoapClient(base.binding, base.address);
Run Code Online (Sandbox Code Playgroud)

将数据发送到第三方服务时,我们只需调用其Web方法,并在不关闭,处置或进行任何清理的情况下将其保留:

BLIND.Answer answer = client.Search(...);
..save to database
return answer;
Run Code Online (Sandbox Code Playgroud)

我们可以做些什么来避免这种time_wait连接的积累?

有没有更好的方法来管理SoapClient?我们应该为每个请求打开一个新的soap客户端并手动关闭它们吗?

如果它是相关的,这是我们的绑定设置方式:

      binding = new BasicHttpBinding();
      binding.Name = "SLTDSoap";
      binding.CloseTimeout = TimeSpan.FromSeconds(Timeout);
      binding.OpenTimeout = TimeSpan.FromSeconds(Timeout);
      binding.ReceiveTimeout = TimeSpan.FromSeconds(Timeout);
      binding.SendTimeout = TimeSpan.FromSeconds(Timeout);
      binding.AllowCookies = false;
      binding.BypassProxyOnLocal = false;
      binding.HostNameComparisonMode = HostNameComparisonMode.StrongWildcard;
      binding.MaxBufferSize = 65536;
      binding.MaxBufferPoolSize = 524288;
      binding.MessageEncoding = WSMessageEncoding.Text;
      binding.TextEncoding = System.Text.Encoding.UTF8;
      binding.TransferMode = TransferMode.Buffered;
      binding.UseDefaultWebProxy …
Run Code Online (Sandbox Code Playgroud)

c# asp.net web-services time-wait

5
推荐指数
1
解决办法
1万
查看次数

标签 统计

asp.net ×1

c# ×1

time-wait ×1

web-services ×1