在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出_asp.net教程-查字典教程网
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
在 .NET Framework 2.0 中未处理的异常导致基于 ASP.NET 的应用程序意外退出
发布时间:2016-12-29 来源:查字典编辑
摘要:但是,系统日志中可能会记录类似于以下内容的事件消息:事件类型:警告事件来源:W3SVC事件类别:无事件ID:1009日期:9/28/2005...

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

事件类型:警告

事件来源:W3SVC

事件类别:无

事件 ID: 1009

日期: 9/28/2005

时间:3:18:11

PM 用户:N/A

计算机:IIS-SERVER

描述:

为应用程序池“DefaultAppPool”提供服务的进程意外终止。进程 ID 是“2548”。进程退出代码是“0xe0434f4d”。

而且,应用程序日志中可能会记录类似于以下内容的事件消息:

事件类型:错误

事件来源:.NET Runtime 2.0 错误报告

事件类别:无

事件 ID: 5000

日期: 9/28/2005

时间:3:18:02 PM

用户:N/A

计算机:IIS-SERVER

描述:

EventType clr20r3, P1 w3wp.exe, P2 6.0.3790.1830, P3 42435be1, P4 app_web_7437ep-9, P5 0.0.0.0, P6 433b1670, P7 9, P8 a, P9 system.exception, P10 NIL.

解决办法:

方法 1修改 IHttpModule 对象的源代码,以便将异常信息记录到应用程序日志中。记录的信息将包含以下内容:

出现异常的虚拟目录路径

异常名称

消息

堆栈跟踪

要修改 IHttpModule 对象,请按照下列步骤操作。

注意:此代码将会在应用程序日志中记录事件类型为“错误”且事件来源为“ASP.NET 2.0.50727.0”的消息。要测试模块,可以请求使用 ThreadPool.QueueUserWorkItem 方法的 ASP.NET 页,以调用引发未处理的异常的方法。

将下面的代码放在名为 UnhandledExceptionModule.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("rnrnUnhandledException logged by UnhandledExceptionModule.dll:rnrnappId=");

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("rnrntype={0}rnrnmessage={1}rnrnstack=rn{2}rnrn",

currentException.GetType().FullName,

currentException.Message,

currentException.StackTrace);

}

EventLog Log = new EventLog();

Log.Source = _sourceName;

Log.WriteEntry(message.ToString(), EventLogEntryType.Error);

}

}

}

将 UnhandledExceptionModule.cs 文件保存到下面的文件夹中:

C:Program FilesMicrosoft Visual Studio 8VC

打开 Microsoft Visual Studio 2005 命令提示符窗口。

键入 sn.exe -k key.snk,然后按 Enter。

键入 csc /t:library /r:system.web.dll,system.dll /keyfile:key.snk UnhandledExceptionModule.cs,然后按 Enter。

键入 gacutil.exe /if UnhandledExceptionModule.dll,然后按 Enter。

键入 ngen install UnhandledExceptionModule.dll,然后按 Enter。

键入 gacutil /l UnhandledExceptionModule,然后按 Enter 以显示 UnhandledExceptionModule 文件的强名称。

9. 将下面的代码添加到基于 ASP.NET 的应用程序的 Web.config 文件中。

<add name="UnhandledExceptionModule"

type="WebMonitor.UnhandledExceptionModule, <strong name>" />

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

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

要启用这种默认行为,请将下面的代码添加到位于以下文件夹的 Aspnet.config 文件中:

复制代码 代码如下:

%WINDIR%Microsoft.NETFrameworkv2.0.50727

<configuration>

<runtime>

<legacyUnhandledExceptionPolicy enabled="true" />

</runtime>

</configuration>

相关阅读
推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
  • 大家都在看
  • 小编推荐
  • 猜你喜欢
  • 最新asp.net教程学习
    热门asp.net教程学习
    编程开发子分类