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