我已阅读帖子ASP.NET应用程序池关闭问题 https://stackoverflow.com/questions/4742122/asp-net-application-pool-shutdown-problem and IIS 7.5:应用程序池问题 https://stackoverflow.com/questions/5486482/iis-7-5-problem-with-application-pool但他们没有回答我的问题。
我有一个 C# ASP.NET 页面,它在代码隐藏中实例化通过 BIN 目录提供的 DLL 中的类,然后调用该实例上的方法。 DLL 内的方法抛出异常System.ArgumentException
由于 a 中不存在列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)。我必须手动重新启动应用程序池,站点才能再次工作。
Update按照要求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)服务器瘫痪。
预计人们会告诉我,我应该在访问列之前检查列是否存在:我知道这一点,并且遗留代码现已更改,但这不是我上面描述的问题,我想知道为什么后果是如此严重。
Update 2
在 DLL 内部调用的相关方法会启动一个包装在try-catch
block:
[...]
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
}