我已经阅读了 ASP.NET应用程序池关闭问题 和 IIS 7.5:应用程序池问题,但它们没有回答我的问题。
我有一个C# ASP.NET页面,在代码后端实例化了通过BIN目录提供的DLL的类,然后调用此实例上的方法。 DLL内部的方法由于DataRow对象中不存在的列而引发System.ArgumentException
。事件日志显示以下错误:
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)。我必须手动重新启动应用程序池,然后网站才能正常工作。
更新
根据请求,以下是来自ASP.NET代码后台的try catch
块:
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 );
}
现在我的问题是,为什么尝试访问不存在的DataRow
列时抛出一个相对“简单”的异常,如System.ArgumentException
,会导致整个网站崩溃? ASP.NET页面的通用try-catch
块也没有帮助,这不应该是完全使整个网站不可用的原因,或者这是错误的假设吗?我从来没有想过这会基本上使服务器崩溃。
预先警告一下,有人可能会告诉我应该在访问列之前检查列是否存在:我知道这一点,而且旧代码现在已经被更改了,但这不是我上面描述的问题,我想知道为什么后果如此严重。
更新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
}