1

トラフィックが多く、何年にもわたって正常に動作している ASP.NET Web サイトがありますが、SQL ストアド プロシージャに列名がないかのように、値をIndexOutOfRangeException読み取るときに突然エラーがログに記録されるようになりました。SqlDataReader

エラー ログに記載されている URL は私にとっては問題なく機能していたので、これは嘘でした。また、1 時間ごとに数千人がアクセスすることもわかっていたページでした。それでも、エラー ログには、5 時間で 80 回しか発生していないことが示されました。

10 個のストアド プロシージャのみがエラーになっているように見えたため、すべての SQL 操作でエラーが発生することはありませんでした。ちょうど同じ 10 の繰り返し。それらのほとんどは非常に単純なものSELECT...WITH(NOLOCK)です。

ストアド プロシージャがまだ機能していること (何年も変更されていないものもあります) を確認するために貴重な時間を無駄にし、それらが明らかに列名を正しく返していることを確認しました。DROP/CREATE私はそれらが再コンパイルされたことを確認することさえ試みました。最終的に、別の開発者が「オフにしてから再度オンにする」ソリューションに到達し、IIS でアプリケーション プールをリサイクルしました。

これにより、問題は約 10 時間解決されましたが、再び (訪問者の約 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に主張する少数のエラーもありました。これらの詳細とストアド プロシージャを除いて、残りの 99% の視聴者はすべて完璧に機能していました。DataBinding: 'System.Data.DataRowView' does not contain a property with the name 'PhotoLocation'Repeater.DataBind()<asp:Repeater>

4

0 に答える 0