网站是.net4.0,用MVC做的,没有源码,只能通过reflector软件查看程序集中的部分方法,连接SqlServer2008数据库。
网站平时访问没有问题,只是偶尔某一天第一次访问网站时,页面报错:
异常详细信息: System.InvalidOperationException: ExecuteReader 要求已打开且可用的 Connection。连接的当前状态: Broken。
源错误:
执行当前 Web 请求期间生成了未经处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:
此处略去,如果有需要,我这里有详细信息。
问题是:这个错误偶尔就会出现一次,而出现错误后,往网站服务器文件夹里上传一个新文件或者等一会儿(就是对程序代码未做任何改动),网站又可以正常访问了。
我查了一下MSDN,对SqlConnection.State为Broken值的描述为:与数据源的连接中断。只有在连接打开之后才可能发生这种情况。可以关闭处于这种状态的连接,然后重新打开。(该值是为此产品的未来版本保留的。)
可是不知道如何人为地复现该错误,以便找到原因彻底解决该问题。
请遇到该问题并解决的朋友不吝赐教,十分感谢!小弟是菜鸟,园豆不多,多担待。
可能是使用了连接池,但可能设置不尽合理,或者遇到连接都被占用,或者资源不足的问题。“往网站服务器文件夹里上传一个新文件或者等一会儿”又可以用,很有可能就是网站应用程序池自动重启了。
可以参看web.config中,连接字符串的部分,将连接字符串贴出来看一下
首先感谢您的热心帮助!然后抱歉回复慢了,因为家里没有网络。
这个问题很有可能是您说的原因,我详细说一下“往网站服务器文件里上传一个新文件或者等一会儿”的情况:
“等一会儿”很简单,返回错误页面后,等到业务那边反馈给我的时候,我再访问时就已经可以正常访问,或者我自己看到错误页面后,过一小会儿,在F5刷新是就可以正常访问了;
“上传一个文件”,因为平时Web.Config文件中这样设置:customErrors mode="On"和compilation debug="false" targetFramework="4.0",在错误页面中看不到错误信息,于是发现错误以后就用FTP下载Web.Config文件更改这两处,然后再上传回服务器,结果再刷新页面就可以正常访问了。
这应该就是您说的“网站应用程序池自动重启了”情况吧,那这种情况是不是通过重启IIS服务可以立即解决呢?
关于Web.Config中的连接字符串节点如下,麻烦您再帮我看看:
<connectionStrings>
<add name="ApplicationServices" connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true" providerName="System.Data.SqlClient" />
<add name="MVEntities" connectionString="metadata=res://*/Models.MV.csdl|res://*/Models.MV.ssdl|res://*/Models.MV.msl;provider=System.Data.SqlClient;provider connection string="Data Source=.;Initial Catalog=MV;Persist Security Info=True;User ID=;Password=;MultipleActiveResultSets=True"" providerName="System.Data.EntityClient" />
</connectionStrings>
最后再次感谢您!
今天下午这个网站又出问题了,跟上次不一样,但都是不能正常连接数据库的问题。这次的异常信息为:
System.InvalidOperationException: 执行该命令需要打开的且可用的连接。连接的当前状态为 已断开。
上次是连接中断,这次是连接已断开。
出现问题的时候,我进入服务器直接重新启动该网站,网站就可以正常访问了。
再不能改动源码的情况下,能否用IIS配置来解决这个问题呢?公司网站服务器系统是Windows2008,IIS管理器是7.0,我现在下载了两个今天的IIS日志文件,不知道有什么帮助没。
@守护晴天: 看连接字符串中的MultipleActiveResultSets可能是引起不稳定性的因素之一,但这个不能贸然去掉,如果代码中用到了这个特性,可能导致功能的失败。
目前能做的,可以看看这里 http://technet.microsoft.com/en-us/library/cc772112(v=WS.10).aspx
关于日志,很抱歉,我不能帮助进行分析。但可以推荐你去用一个工具 logparse http://www.microsoft.com/en-us/download/details.aspx?id=24659 找找问题
@陈希章: 很感谢您帮我找到了出问题的可能的点,剩下的我自己再努力尝试分析吧!毕竟不是大问题,只是我想把问题根本原因找到,不想这么不明不白的。日志文件我昨天看了,头很晕,4000K+的文件有2万多行,这个不会麻烦你的,这活太累,呵呵。我只是想确认一下:数据库连接断开这个情况,是否可以从IIS日志文件中查到一些线索。最后感谢您推荐的文章和工具!
用ILspy把对应的代码找到,发上来瞧瞧。。。
首先也感谢您的热心帮助!我现在还是刚入门的菜鸟,您说的ILspy我没用过,我回头会学习一下。
错误页面中的堆栈跟踪信息,里面涉及到两个文件。我用reflector看到的c#代码,只有方法签名,没找到方法体。我从网上查到一个解决办法,就是在出错的位置,if判断一下,如果State是Broken,就将连接先Close,再Open。但是我问我同事,他说这个网站没有源码,因此没法改动程序。而且这个问题应该是ADO.NET在连接数据库时出现的连接中断异常,我想看看能不能不改程序代码,解决这个问题。同时没有源码,不能断点调试,我也不知道发哪段代码出来(这个限于我自身水平,请理解)。所以没办法进一步提供解决问题的相关信息,请多谅解!
最后再次感谢您!
@守护晴天: ILspy是和reflector类似的反编译软件,但是是免费的。
@王凌志: 哦,这样啊!我还以为ILspy是将程序代码反编译成IL中间代码呢,我看C#代码还凑合,IL代码不太熟练,现在看着还比较费劲。代码我就先不找了,即使找到了也没法改,不过还是十分感谢你的热心帮助!