未经处理的异常会导致基于 ASP.NET 的应用程序在.NET Framework 中意外退出

文章翻译 文章翻译
文章编号: 911816 - 查看本文应用于的产品
注意本文适用于 Microsoft.NET Framework 2.0 和所有更高版本。
展开全部 | 关闭全部

本文内容

症状

在 Microsoft 的基于 ASP.NET 的应用程序基于 Microsoft.NET Framework 2.0 或更高版本中引发了未处理的异常时,该应用程序将会意外退出。发生此问题时,您必须了解该问题没有异常信息记录在应用程序日志中。

但是,与以下类似的事件消息可能会记录在系统日志中:

事件类型: 警告
事件源: W3SVC
事件类别: 无
事件 ID: 1009
2005-9-28 日期:
时间: 3:18:11
PM 用户: 不适用
IIS 服务器的计算机:
说明:
提供应用程序池服务默认应用程序池进程意外终止。进程 id 是"2548"。进程退出代码为"0xe0434f4d"。

此外,与以下类似的事件消息可能会记录在应用程序日志中:

事件类型: 错误
事件源:.NET 运行库 2.0 错误报告
事件类别: 无
事件 ID: 5000
2005-9-28 日期:
时间: 下午 3:18:02
用户:N/A
IIS 服务器的计算机:
说明:
事件类型 clr20r3 P1 w3wp.exe,P2 6.0.3790.1830,P3 42435be1 P4 app_web_7437ep-9,P5 0.0.0.0,P6 433b1670 P7 P8 第 9,P9 system.exception,P10 零。

原因

由于未处理的异常的默认策略已更改.NET Framework 2.0 和更高版本中,将出现此问题。默认情况下,未经处理的异常的策略是要终止的工作进程。

在 Microsoft.NET Framework 1.1 和 Microsoft.NET Framework 1.0 中,在托管线程上的未经处理的异常将被忽略。除非附加调试程序以捕获异常时,您可能意识不到出错。

ASP.NET 使用未经处理的异常的.NET Framework 2.0 和更高版本中的默认策略。引发未经处理的异常时,基于 ASP.NET 的应用程序会意外退出。

此行为不适用于一个请求的上下文中发生的异常。这几种例外情况仍是处理和包装的HttpException对象。请求的上下文中发生的异常不会导致工作进程结束。但是,上下文之外的申请,如异常计时器的线程上或在回调函数中,未经处理的异常会导致工作进程结束。

解决方案

要解决此问题,请使用下列方法之一。

方法 1

修改IHttpModule对象的源代码,以便它将异常信息记录到应用程序日志。记录的信息将包括以下:
  • 在其中的虚拟目录路径 exceptionoccurred
  • 异常名称
  • 消息
  • 堆栈跟踪
若要修改的IHttpModule对象,请执行以下步骤。

注意此代码将记录一条消息,在应用程序日志中有错误的事件类型和事件源的ASP.NET 2.0.50727.0 。若要测试模块,请求一个 ASP.NET 页,它使用ThreadPool.QueueUserWorkItem方法来调用引发未经处理的异常的方法。
  1. 将下面的代码放在 namedUnhandledExceptionModule.cs 的文件中。
    using System;
    using System.Diagnostics;
    using System.Globalization;
    using System.IO;
    using System.Runtime.InteropServices;
    using System.Text;
    using System.Threading;
    using System.Web;
     
    namespace WebMonitor {
        public class UnhandledExceptionModule: IHttpModule {
    
            static int _unhandledExceptionCount = 0;
    
            static string _sourceName = null;
            static object _initLock = new object();
            static bool _initialized = false;
    
            public void Init(HttpApplication app) {
    
                // Do this one time for each AppDomain.
                if (!_initialized) {
                    lock (_initLock) {
                        if (!_initialized) { 
    
                            string webenginePath = Path.Combine(RuntimeEnvironment.GetRuntimeDirectory(), "webengine.dll"); 
    
                            if (!File.Exists(webenginePath)) {
                                throw new Exception(String.Format(CultureInfo.InvariantCulture,
                                                                  "Failed to locate webengine.dll at '{0}'.  This module requires .NET Framework 2.0.", 
                                                                  webenginePath));
                            } 
    
                            FileVersionInfo ver = FileVersionInfo.GetVersionInfo(webenginePath);
                            _sourceName = string.Format(CultureInfo.InvariantCulture, "ASP.NET {0}.{1}.{2}.0",
                                                        ver.FileMajorPart, ver.FileMinorPart, ver.FileBuildPart);
    
                            if (!EventLog.SourceExists(_sourceName)) {
                                throw new Exception(String.Format(CultureInfo.InvariantCulture,
                                                                  "There is no EventLog source named '{0}'. This module requires .NET Framework 2.0.", 
                                                                  _sourceName));
                            }
     
                            AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(OnUnhandledException);
     
                            _initialized = true;
                        }
                    }
                }
            }
    
            public void Dispose() {
            }
    
            void OnUnhandledException(object o, UnhandledExceptionEventArgs e) {
                // Let this occur one time for each AppDomain.
                if (Interlocked.Exchange(ref _unhandledExceptionCount, 1) != 0)
                    return;
    
                StringBuilder message = new StringBuilder("\r\n\r\nUnhandledException logged by UnhandledExceptionModule.dll:\r\n\r\nappId=");
    
                string appId = (string) AppDomain.CurrentDomain.GetData(".appId");
                if (appId != null) {
                    message.Append(appId);
                }
                
    
                Exception currentException = null;
                for (currentException = (Exception)e.ExceptionObject; currentException != null; currentException = currentException.InnerException) {
                    message.AppendFormat("\r\n\r\ntype={0}\r\n\r\nmessage={1}\r\n\r\nstack=\r\n{2}\r\n\r\n",
                                         currentException.GetType().FullName, 
                                         currentException.Message,
                                         currentException.StackTrace);
                }           
    
                EventLog Log = new EventLog();
                Log.Source = _sourceName;
                Log.WriteEntry(message.ToString(), EventLogEntryType.Error);
            }
    
        }
    }
  2. 将 UnhandledExceptionModule.cs 文件保存到 followingfolder 中:
    C:\Program 使用 Visual Studio 8\VC
  3. 打开 Microsoft Visual Studio 2005 CommandPrompt。
  4. 键入 sn.exe-k key.snk并输入 thenpress。
  5. 键入 csc /t:library UnhandledExceptionModule.cs /r:system.web.dll,system.dll/keyfile:key.snk,然后 pressENTER。
  6. 键入 gacutil.exe /ifUnhandledExceptionModule.dll然后按 enter 键。
  7. 键入 ngen installUnhandledExceptionModule.dll然后按 enter 键。
  8. 键入 gacutil /lUnhandledExceptionModule然后按 enter 键以显示 thestrong UnhandledExceptionModule文件的名称。
  9. 9.基于 yourASP.NET 的应用程序的 Web.config 文件中添加以下代码。
    <add name="UnhandledExceptionModule" 
    	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

方法 2

将未经处理的异常策略更改回发生在.NET Framework 1.1 和.NET Framework 1.0 中的默认行为。

注意我们不建议您更改默认行为。如果您忽略异常,应用程序可能会泄漏资源并放弃锁定。

若要启用此默认行为,请到位于以下文件夹中的 Aspnet.config 文件中添加以下代码:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>
    <runtime>
        <legacyUnhandledExceptionPolicy enabled="true" />
    </runtime>
</configuration>

状态

这种现象是设计使然。

更多信息

有关.NET Framework 2.0 版中的更改的详细信息,请访问以下 Microsoft 开发人员网络 (MSDN) 网站:
http://msdn2.microsoft.com/en-us/netframework/aa570326.aspx

属性

文章编号: 911816 - 最后修改: 2013年10月7日 - 修订: 2.0
这篇文章中的信息适用于:
  • Microsoft .NET Framework 4.5
  • Microsoft .NET Framework 4.0
  • Microsoft .NET Framework 3.0
  • Microsoft .NET Framework 2.0
关键字:?
kbtshoot kbfix kbprogramming kbprb kbmt KB911816 KbMtzh
机器翻译
重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。
点击这里察看该文章的英文版: 911816
Microsoft和/或其各供应商对于为任何目的而在本服务器上发布的文件及有关图形所含信息的适用性,不作任何声明。 所有该等文件及有关图形均"依样"提供,而不带任何性质的保证。Microsoft和/或其各供应商特此声明,对所有与该等信息有关的保证和条件不负任何责任,该等保证和条件包括关于适销性、符合特定用途、所有权和非侵权的所有默示保证和条件。在任何情况下,在由于使用或运行本服务器上的信息所引起的或与该等使用或运行有关的诉讼中,Microsoft和/或其各供应商就因丧失使用、数据或利润所导致的任何特别的、间接的、衍生性的损害或任何因使用而丧失所导致的之损害、数据或利润不负任何责任。

提供反馈

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com