Прерывистое исключение IndexOutOfRangeException предполагает отсутствие столбца SQL, но устраняется путем повторного использования IIS - PullRequest
0 голосов
/ 25 апреля 2018

У нас есть веб-сайт ASP.NET с большим объемом трафика, который успешно работал в течение многих лет, когда внезапно он начал регистрировать ошибки IndexOutOfRangeException при чтении некоторых значений SqlDataReader, как если бы в наших хранимых процедурах SQL отсутствовал столбецназвание.

Это была ложь, потому что URL, упомянутый в журнале ошибок, работал нормально для меня, и была страницей, которую, как я знал, несколько тысяч человек будут посещать каждый час;однако журнал ошибок только показал, что это происходит 80 раз за 5 часов.

Только десять хранимых процедур оказались ошибочными, поэтому не было ошибок при каждой операции 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% зрителей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...