我有几台 Web 服务器运行相同的 asp.net mvc Web 应用程序,连接到一个 mongodb 服务器。一台 Web 服务器不断抛出 SocketException,即使我重新启动 IIS。其他工作正常。这不是第一次出现异常。几周前,另一台 Web 服务器遇到了同样的问题,而当时其他服务器正在工作。错误消息:
由于系统缺少足够的缓冲区空间或队列已满,因此无法对套接字执行操作。
现在我只能重新启动服务器以暂时解决问题。我通过修改HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Tcpip\Parameters\MaxUserPort
为 65534 来确保正确设置了 Web 服务器的动态端口范围。现在我怀疑这是否是 C# mongodb 驱动程序的错误。我查看了驱动程序的源代码,尤其是MongoCursorEnumerator.cs,其中释放了连接。该类MongoCursorEnumerator<TDocument>
实现IDisposable
并正确释放其Dispose
方法中的连接。但它没有析构函数(终结器),这保证了Dispose
在 GC 中的调用。
现在我确保所有与连接相关的代码都正确包装在using
项目的块中。在这种情况下,缺少析构函数/终结器会导致 SocketException 吗?如果不是,那么这个异常的可能原因是什么?
更多信息:ASP.NET MVC 3、Windows Server 2008 R2、Mongo DB 2.0、Mongo Db Driver for C# 1.5
更新
最新版本的 mongo db C# 驱动程序解决了这个问题