Прерывистое исключение IndexOutOfRangeException указывает на отсутствие столбца SQL, но устраняется путем перезапуска IIS
У нас есть веб-сайт 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% зрителей.