4

我有几台 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# 驱动程序解决了这个问题

4

2 回答 2

0

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

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

于 2013-05-05T22:15:16.253 回答
0

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

于 2016-06-29T13:51:38.750 回答