gpt4 book ai didi

exception - 为什么从 ASP.NET 页面调用的 DLL 中出现异常后,我的 IIS7 应用程序池会关闭?

转载 作者:行者123 更新时间:2023-12-02 19:34:12 24 4
gpt4 key购买 nike

我已阅读帖子 ASP.NET application pool shutdown problemIIS 7.5: problem with Application pool但他们没有回答我的问题。

我有一个 C# ASP.NET 页面,它在代码隐藏中实例化通过 BIN 目录提供的 DLL 中的类,然后调用该实例上的方法。 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 中的线程。 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
}

最佳答案

您的应用程序池很可能被 IIS's Rapid Fail Protection 自动关闭正如您在链接的问题中注意到的那样。如果您检查事件日志,可能会快速连续抛出多个未处理的异常。

简单地说,在可配置的时间跨度(默认为 5 分钟内 5 个)内出现足够多的未处理异常将关闭 AppPool,导致 503 Service Unavailable 响应。

此功能背后的原因是,如果您的应用程序出现故障,您可能不希望它在每次后续请求时自动重新启动,从而消耗资源并可能损坏数据。

我必须承认这也不是我所期望的“默认”行为。

查看Rick Stahls explanation ,有点深入。

要真正解决此问题,您需要捕获异常,或防止引发异常(就像 @leppie 建议的那样)。未处理的异常应该会破坏整个执行过程(意味着单个请求/工作进程,而不是 IIS) - 它使 .Net 代码更容易调试,因为它不会隐藏错误或简单地挂起应用程序。 p>

请注意,这在 .Net 2.0 中已更改:
http://msdn.microsoft.com/en-us/library/ms228965.aspx
http://support.microsoft.com/kb/911816

更新
根据您上面的更新,我认为如果您的异常是从 CreateReport() 抛出的,则实际上不会捕获该异常。该方法在单独的线程上执行:

exception still thrown

如果还没有的话,您需要在 CreateReport() 的主体中添加一个 try-catch:

public static void CreateReport() {
try {
throw new Exception("reducto");
} catch {
Console.WriteLine("done did.");
}
}

关于exception - 为什么从 ASP.NET 页面调用的 DLL 中出现异常后,我的 IIS7 应用程序池会关闭?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15975249/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com