Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# MongoDB连接导致System.Net.Sockets.SocketException_C#_Mongodb - Fatal编程技术网

C# MongoDB连接导致System.Net.Sockets.SocketException

C# MongoDB连接导致System.Net.Sockets.SocketException,c#,mongodb,C#,Mongodb,我有几个web服务器运行相同的asp.net mvc web应用程序,连接到一个mongodb服务器。一个web服务器不断抛出SocketException,即使我重新启动IIS。其他的都很好。这不是第一次出现这种例外情况。几周前,另一个web服务器出现了相同的问题,而当时其他服务器正在工作。错误消息: 无法在套接字上执行操作,因为系统已关闭 缺少足够的缓冲区空间或队列已满 现在我只能重新启动服务器来暂时修复问题。我通过将HKEY\U LOCAL\U MACHINE\System\Current

我有几个web服务器运行相同的asp.net mvc web应用程序,连接到一个mongodb服务器。一个web服务器不断抛出SocketException,即使我重新启动IIS。其他的都很好。这不是第一次出现这种例外情况。几周前,另一个web服务器出现了相同的问题,而当时其他服务器正在工作。错误消息:

无法在套接字上执行操作,因为系统已关闭 缺少足够的缓冲区空间或队列已满

现在我只能重新启动服务器来暂时修复问题。我通过将
HKEY\U LOCAL\U MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort
修改为65534,确保web服务器的动态端口范围设置正确。现在我怀疑这是否是C#mongodb驱动程序的bug。我研究了驱动程序的源代码,特别是在释放连接的地方。类
mongocursoremulator
实现
IDisposable
,并在其
Dispose
方法中正确释放连接。但是它没有析构函数(finalizer),它保证在GC中调用
Dispose

现在,我使用项目中的块确保所有与连接相关的代码都正确地包装在
中。在这种情况下,是否缺少析构函数/终结器会导致SocketException?如果不是,那么这个异常的可能原因是什么

更多信息:ASP.NET MVC 3、Windows Server 2008 R2、Mongo DB 2.0、用于C#1.5的Mongo DB驱动程序

更新

最新版本的mongo db C#driver解决了这个问题

导致此错误的一个原因(直接来自Windows操作系统)是TCP/IP连接快速打开和关闭


您是否在代码中的任何位置调用Disconnect?这将导致关闭所有套接字,然后打开新的套接字来替换它们。

将mongodb驱动程序升级到2.12或更高版本将允许您捕获此异常。

MongoCorSoreNumerator
实现
IEnumerable
,这意味着编译器将在finally块中发出对其dispose方法的调用。假设它在foreach循环中使用,它不需要终结器。如果枚举数是手动使用的,那么可能不会调用dispose。@ChristopherCurrens:我自己也认为dispose肯定会被调用。这个异常真的很奇怪。我可能有1%的时间(大约10次写入/秒)会遇到这个错误-对于这个问题,一些try/catch/retry代码是常见的建议吗?