1

我们有一个流量很大的 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% 的观众都可以正常工作。

4

0 回答 0