2016-11-25 84 views
4

我正在主持一个ASP.NET web API,它已经生产了好几年,并且已经看到几十个更新。突然之间,在代码稍做修改之后,无论使用哪个浏览器或客户端,API在恰好50个请求之后崩溃。 Web服务器重新启动会立即恢复API可用性(应用程序池回收不会),但神秘的倒计时重新开始...ASP.NET网站在经过50次请求后崩溃

这种奇怪的效果在多台计算机(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依赖项。我怀疑强加“50”的限制的Firebird(唯一的外部依赖),但是我所有的实验和Google搜索都无济于事。

我可以提取的唯一中途有用的日志消息说由于超时错误导致数据库连接失败。 (我使用的是Firebird 2.5 SuperServer x64和Firebird .NET Provider,版本3.0.2的FirebirdSql.Data.FirebirdClient.dll FirebirdSql.Data.FirebirdClient.dll,目前为止我服务的很好。)但是,我可以连接到数据库并浏览它通过FlameRobin。在任何情况下,只要我回到以前的API版本,一切正常。

空难后,先前被清除firebird.log包含50级这样的相同的消息:

AB--CD (Server) Fri Nov 25 14:22:57 2016 
    INET/inet_error: read errno = 10054 

我已经提到的,这个问题在不同的系统中仍然存在独立的本地数据库。数据库备份/恢复无用,就像重新启动Firebird服务一样。只有Web服务器重新启动才能完成。

感谢您的任何想法...

+12

我想像你不处置您的连接,并杏连接池。没有代码虽然,这是一个猜测 – Liam

+0

我同意利亚姆 - 听起来像你没有关闭/处置SqlConnections或其他和连接池已满。 – DrMistry

+1

错误10054是由同级重置的(winsock)连接。如果您有一个连接池(Firebird ado.net提供程序默认情况下),并且您在池中打开了50个连接,则应用程序崩溃会突然终止套接字,导致Firebird服务器记录这些错误。 Firebird本身不会强加连接限制,除非Windows上的Firebird SuperServer限制为最大1024(或更新版本中的2048)。我只能建议你仔细审查工作和非工作版本之间的变化。 –

回答

3

感谢,利亚姆/ DrMistry /马克,

这就是它了。神秘的“50”是连接字符串中的最大池大小。这个我追逐几天的bug是我见过的最简单的一个 - 数据库连接完成的行是重复。就像这样:

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

由于只有第二连接得到闭合,每个请求发送一个连接到冷宫,因此连接池很快就被拥挤。如果你有机会在周五晚上发布,就会发生这种情况

删除两个相同的线路之一来解决问题,当然......