Я прочитал сообщения Проблема закрытия пула приложений ASP.NET и IIS 7.5: проблема с пулом приложений но они не ответили на мой вопрос.
У меня есть страница ASP.NET С#, которая в коде-образе создает экземпляр класса из DLL, поставляемого через каталог BIN, а затем вызывает метод в этом экземпляре. Метод внутри DLL выбрасывает System.ArgumentException
из-за не существующего столбца в объекте DataRow
. Журнал событий показывает следующую ошибку:
Source: ASP.NET 2.0.50727.0
Application ID: /LM/W3SVC/1/ROOT/...
Process ID: 9476
Exception: System.ArgumentException
Message: Column 'someColumn' does not belong to table.
StrackTrace:
Вызывающий код на странице ASP.NET переносит вызов метода в общий try-catch
блок. Когда я запрашиваю страницу, это приведет к сбою соответствующего пула приложений моего экземпляра IIS, и мой веб-сайт больше не доступен (ошибка 503). Я вручную должен перезапустить пул приложений, и сайт снова работает.
Обновление
Как запрошено блок try catch
из кода ASP.NET позади:
try
{
SomeExternalClass someExternalClass = new SomeExternalClass();
someExternalClass.SomeMethod( someId );
}
catch( Exception ex )
{
// "smp" is an instance of "StatusMessagePanel", a control we use on all pages
// to show error information, basically a div container with an icon.
smp.ShowError( ex.Message );
}
Теперь мой вопрос в том, почему относительно простое исключение, такое как System.ArgumentException
, которое бросается при попытке получить доступ к не существующему столбцу DataRow
, приводит к сбою всего веб-сайта? Также не помогает общий шаблон try-catch
на странице ASP.NET, и это не должно стать причиной полного недопущения всего веб-сайта или неправильного предположения? Я никогда бы не подумал, что это может в основном сесть на сервер (II).
В ожидании, что люди расскажут мне, что я должен проверять наличие столбцов до того, как я их получу: я знаю об этом, и устаревший код теперь изменен, но это не мой вопрос, как описано выше, я бы хотел знать, почему последствия настолько резкие.
Обновление 2
Этот метод, вызываемый внутри DLL, запускает поток, который завернут в блок try-catch
:
[...]
try
{
ThreadStart starter = () => CreateReport(...)
Thread thread = new Thread( starter );
thread.Start();
if( !thread.Join( TimeSpan.FromMinutes( 15 ) ) )
{
// Log some timeout warning
}
else
{
// Log information about successful report generation
}
}
catch( Exception ex )
{
// Log error information
}