我有一些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
方法中释放连接。但它没有析构函数(终结器),它保证在GC中调用Dispose
。
现在,我确保所有与连接相关的代码都正确地包装在项目的using
块中。在这种情况下,缺少析构函数/终结符会导致SocketException吗?如果没有,那么这个例外的可能原因是什么呢?
更多信息:ASP.NET MVC 3,Windows Server 2008 R2,Mongo DB 2.0,C#1.5的Mongo Db驱动程序
更新
最新版本的mongo db C#驱动程序解决了这个问题
答案 0 :(得分:0)
此错误的一个原因(直接来自Windows操作系统)是TCP / IP连接快速打开和关闭的时候。
您是否在代码中的任何位置调用Disconnect?这将导致所有套接字关闭,这将导致打开新的套接字以替换它们。
答案 1 :(得分:0)
将mongodb驱动程序升级到2.12或更高版本将允许您捕获此异常。