我们有一个流量很大的 ASP.NET 网站,多年来一直运行良好,但突然它IndexOutOfRangeException
在读取一些SqlDataReader
值时开始记录错误,就好像我们的 SQL 存储过程缺少列名一样。
这是一个谎言,因为错误日志中提到的 URL 对我来说工作正常,而且我知道每小时也会有几千人访问这个页面;然而错误日志只显示它在 5 小时内发生了 80 次。
只有十个存储过程似乎有问题,所以并不是每个 SQL 操作都出错。只是同样的十个一遍又一遍。大部分都是非常简单的东西SELECT...WITH(NOLOCK)
。
我浪费了宝贵的时间来确保存储过程仍在工作(有些多年来没有变化)并且它们清楚地正确返回了列名。我什至尝试过DROP/CREATE
确保它们被重新编译。最后,另一个开发人员找到了“关闭并再次打开”的解决方案,并在 IIS 中回收了应用程序池。
这解决了大约十个小时的问题,然后它又悄悄回来了(再次,对于我们大约 1% 的访问者),然后我们重新启动了 IIS,又过了半天的平静。但是要多久才能再次回来?!
我将粘贴日志中的内容,以防万一:
Event code: 3005
Event message: An unhandled exception has occurred.
Event time: 24/04/2018 21:45:45
Event time (UTC): 24/04/2018 21:45:45
Event ID: e79bdcb8491b4e38851bd63298afef62
Event sequence: 35007
Event occurrence: 1278
Event detail code: 0
Application information:
Application domain: /LM/W3SVC/8/ROOT-1-131690781812076632
Trust level: Full
Application Virtual Path: /
Application Path: F:\BLAH\Whatever\
Machine name: MACHINEDB
Process information:
Process ID: 17824
Process name: w3wp.exe
Account name: IIS APPPOOL\Whatever
Exception information:
Exception type: IndexOutOfRangeException
Exception message: PhotoCaption
at System.Data.ProviderBase.FieldNameLookup.GetOrdinal(String fieldName)
at System.Data.SqlClient.SqlDataReader.GetOrdinal(String name)
at System.Data.SqlClient.SqlDataReader.get_Item(String name)
at Combined.article.DoPhotoStuff(Int32 ArticleID) in F:\stuff\Whatever\photo\view.aspx.vb:line 69
at Combined.article.Page_Load(Object sender, EventArgs e) in F:\stuff\Whatever\photo\view.aspx.vb:line 34
at System.Web.UI.Control.OnLoad(EventArgs e)
at System.Web.UI.Control.LoadRecursive()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Request information:
Request URL: http://www.mywebsite.com/photo/12345
Request path: /photo/12345
User host address: 157.55.39.214
User:
Is authenticated: False
Authentication Type:
Thread account name: IIS APPPOOL\Whatever
每种情况下的代码如下所示:
Dim oRecordSet As SqlDataReader = oCommand.ExecuteReader()
oRecordSet.Read()
Blah = oRecordSet("PhotoCaption") 'this line errors
还有较少数量的HttpException
错误,它声称DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'PhotoLocation'
在再次执行Repeater.DataBind()
- 时,当您引用记录集中不存在的列名时您期望得到的错误类型。除了这些<asp:Repeater>
细节和存储过程之外,其他 99% 的观众都可以正常工作。