你目前正处于脱机状态,正在等待 Internet 重新连接

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

重要说明:本文是由 Microsoft 机器翻译软件进行的翻译并可能由 Microsoft 社区通过社区翻译机构(CTF)技术进行后期编辑,或可能是由人工进行的翻译。Microsoft 同时向您提供机器翻译、人工翻译及社区后期编辑的文章,以便对我们知识库中的所有文章以多种语言提供访问。翻译的文章可能存在词汇、句法和/或语法方面的错误。Microsoft 对由于内容的误译或客户对内容的使用所导致的任何不准确、错误或损失不承担责任。

点击这里察看该文章的英文版: 911816
注意:本文适用于 Microsoft.NET Framework 2.0 和所有更高版本。
症状
基于 ASP.NET 的应用程序基于 Microsoft.NET Framework 2.0 或更高版本的 Microsoft 中引发了未处理的异常时,该应用程序意外退出。发生此问题时,您必须了解此问题没有异常信息记录在应用程序日志中。

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

事件类型: 警告
事件源: 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
用户: 不适用
计算机: IIS 服务器
说明:
事件类型 clr20r3,第 w3wp.exe P1,P2 6.0.3790.1830,P3 42435be1 P4 app_web_7437ep-9,P5 0.0.0.0,P6 433b1670 P7 9,P8,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 /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cs,然后 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) 网站:
崩溃

警告:本文已自动翻译

属性

文章 ID:911816 - 上次审阅时间:02/09/2016 05:20:00 - 修订版本: 3.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
反馈
ement('meta');m.name='ms.dqp0';m.content='true';document.getElementsByTagName('head')[0].appendChild(m);" onload="var m=document.createElement('meta');m.name='ms.dqp0';m.content='false';document.getElementsByTagName('head')[0].appendChild(m);" src="http://c1.microsoft.com/c.gif?">