ASP.NET网站在恰好50个请求后崩溃

4
我正在托管一个ASP.NET Web API,它已经在生产中运行了几年,已经经历了几十次更新。突然之间,在代码只进行了轻微更改后,无论使用哪个浏览器或客户端,API在恰好50个请求后崩溃。Web服务器重启立即恢复API的可用性(应用程序池重置不起作用),但神秘的倒计时重新开始...
这种奇怪的现象在几台机器(Windows Server 2008、Windows Server 2013和Windows 7)和不同的Web服务器(IIS 7.5、IIS 8.5、UltiDev Web Server)之间持续存在。IDE为Visual Studio Community 2015; .NET版本为4.5.2。
我没有添加外部API依赖项。我怀疑Firebird(唯一的外部依赖项)会强加“50”的限制,但是我所有的实验和谷歌搜索都没有结果。
我能够提取的唯一有用的日志消息是,由于超时错误,DB连接失败。(我正在使用Firebird 2.5 SuperServer x64和Firebird .NET Provider,其中包含版本为3.0.2的FirebirdSql.Data.FirebirdClient.dll,在这之前一直表现良好。)不过,我可以通过FlameRobin连接到数据库并浏览它。无论如何,只要回到先前的API版本,一切都运行正常。
崩溃后,以前清除的firebird.log包含50个相同的消息,如下所示:
AB-01234-CD (Server)    Fri Nov 25 14:22:57 2016
    INET/inet_error: read errno = 10054

我已经提到该问题在使用独立本地数据库的不同系统中仍然存在。备份/还原数据库以及重启Firebird服务都是无效的。只有重新启动Web服务器才能解决该问题。
感谢任何想法...

12
我想你没有断开你的连接并且使用了最大连接池。不过,没有代码的话,这只是一个猜测。 - Liam
我同意Liam的观点 - 听起来你没有关闭/处理SqlConnection或类似的连接,导致连接池已满。 - DrMistry
1
错误10054是(winsock)连接被对等方重置。如果您有一个连接池(Firebird ado.net提供程序默认情况下具有),并且在池中打开了50个连接,则应用程序崩溃将突然终止套接字,导致Firebird服务器记录这些错误。除了Windows上的Firebird SuperServer限制为最大1024(或新版本中的2048)外,Firebird本身不会强制执行连接限制。我只能建议您仔细审查工作版本和非工作版本之间的更改。 - Mark Rotteveel
1个回答

4

谢谢,Liam/DrMistry/Mark,

就是这个问题。神秘的“50”是连接字符串中的最大池大小。我为此问题奔波了数天,但问题却是我见过的最简单的之一——DB连接所在的行被重复了。像这样:

db.Connect();
db.Connect();

由于只有第二个连接被关闭,每个请求都将一个连接置于待处理状态,因此连接池很快就会拥挤。如果你在星期五发布,就会发生这种情况!

当然,删除其中一个相同的行解决了这个问题...


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接