Bạn hiện đang ngoại tuyến, hãy chờ internet để kết nối lại

Trường hợp ngoại lệ không được gây ra ứng dụng ASP.NET để bất ngờ thoát ở Khuôn khổ .NET

QUAN TRỌNG: Bài viết này được dịch bằng phần mềm dịch thuật của Microsoft và có thể được Cộng đồng Microsoft chỉnh sửa lại thông qua công nghệ CTF thay vì một biên dịch viên chuyên nghiệp. Microsoft cung cấp các bài viết được cả biên dịch viên và phần mềm dịch thuật thực hiện và cộng đồng chỉnh sửa lại để bạn có thể truy cập vào tất cả các bài viết trong Cơ sở Kiến thức của chúng tôi bằng nhiều ngôn ngữ Tuy nhiên, bài viết do máy dịch hoặc thậm chí cộng đồng chỉnh sửa sau không phải lúc nào cũng hoàn hảo. Các bài viết này có thể chứa các sai sót về từ vựng, cú pháp hoặc ngữ pháp, Microsoft không chịu trách nhiệm về bất kỳ sự thiếu chính xác, sai sót hoặc thiệt hại nào do việc dịch sai nội dung hoặc do hoạt động sử dụng của khách hàng gây ra.

Nhấp chuột vào đây để xem bản tiếng Anh của bài viết này: 911816
Lưu ýBài viết này áp dụng cho Microsoft Khuôn khổ .NET 2.0 và sau đó tất cả các phiên bản.
Triệu chứng
Khi một ngoại lệ không được ném vào một Microsoft ASP.NET dựa trên các ứng dụng được xây dựng trên Microsoft Khuôn khổ .NET 2.0 hoặc phiên bản mới hơn, các ứng dụng bất ngờ bỏ cuộc. Khi vấn đề này xảy ra, không có thông tin ngoại lệ mà bạn phải có sự hiểu biết vấn đề ghi vào Nhật ký ứng dụng.

Tuy nhiên, một thông báo sự kiện tương tự như sau đây có thể được ghi vào Nhật ký hệ thống:

Loại sự kiện: cảnh báo
Sự kiện nguồn: W3SVC
Thể loại sự kiện: không có
ID sự kiện: 1009
Ngày: 9/28/2005
Thời gian: 3:18:11
PM người dùng: N/A
Máy tính: Máy chủ IIS
Trò chơi mô tả:
Một tiến trình phục vụ ngoài trời ứng dụng 'DefaultAppPool' kết thúc bất ngờ. Id quá trình là '2548'. Mã thoát khỏi quá trình là '0xe0434f4d'.

Ngoài ra, một thông báo sự kiện tương tự như sau đây có thể được ghi vào Nhật ký ứng dụng:

Loại sự kiện: lỗi
Sự kiện nguồn: .NET báo cáo lỗi thời gian chạy 2.0
Thể loại sự kiện: không có
ID sự kiện: 5000
Ngày: 9/28/2005
Thời gian: 3:18:02 PM
Người dùng: N/A
Máy tính: Máy chủ IIS
Trò chơi mô tả:
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, system.exception P9, P10 NIL.

Nguyên nhân
Vấn đề này xảy ra bởi vì chính sách mặc định cho trường hợp ngoại lệ không được đã thay đổi trong Khuôn khổ .NET 2.0 và phiên bản mới hơn. theo mặc định, chính sách đối với trường hợp ngoại lệ không được là để kết thúc quá trình công nhân.

Trong Microsoft Khuôn khổ .NET 1.1 và trong Microsoft Khuôn khổ .NET 1.0, các ngoại lệ không được vào quản lý chủ đề đã được bỏ qua. Trừ khi bạn đính kèm trình gỡ lỗi để bắt ngoại lệ, bạn sẽ không nhận ra rằng bất cứ điều gì là sai.

ASP.NET sử dụng chính sách mặc định cho các ngoại lệ không được ở Khuôn khổ .NET 2.0 và phiên bản mới hơn. Khi một ngoại lệ không được được ném, ứng dụng ASP.NET bất ngờ bỏ cuộc.

Hành vi này không áp dụng cho trường hợp ngoại lệ xảy ra trong bối cảnh của một yêu cầu. Các loại trường hợp ngoại lệ vẫn được xử lý và bọc bởi một đối tượng HttpException . Trường hợp ngoại lệ xảy ra trong bối cảnh của một yêu cầu không gây ra quá trình nhân viên để kết thúc. Tuy nhiên, không được các trường hợp ngoại lệ bên ngoài bối cảnh của một yêu cầu, chẳng hạn như trường hợp ngoại lệ trên một chủ đề bộ đếm thời gian hoặc trong một chức năng gọi lại, gây ra quá trình nhân viên để kết thúc.
Giải pháp
Để giải quyết vấn đề này, sử dụng một trong những phương pháp sau đây.

Phương pháp 1

Sửa đổi mã nguồn cho các đối tượng IHttpModule để nó sẽ đăng thông tin ngoại lệ vào Nhật ký ứng dụng. Thông tin kí nhập sẽ bao gồm những điều sau đây:
  • Đường dẫn mục tin thư thoại ảo mà trong đó exceptionoccurred
  • Tên ngoại lệ
  • Tin thư thoại
  • Theo dõi stack
Để sửa đổi các đối tượng IHttpModule , hãy làm theo các bước sau.

Lưu ý Mã này sẽ đăng một thư có loại sự kiện lỗi và sự kiện nguồn của ASP.NET 2.0.50727.0 Nhật ký ứng dụng. Để kiểm tra các mô-đun, yêu cầu một trang ASP.NET sử dụng phương pháp ThreadPool.QueueUserWorkItem để gọi một phương pháp ném một ngoại lệ không được.
  1. Đặt đoạn mã sau trong một tập tin là 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. Lưu các tập tin UnhandledExceptionModule.cs để followingfolder:
    C:\Program Files\Microsoft Visual Studio 8\VC
  3. Mở Microsoft Visual Studio 2005 CommandPrompt.
  4. Loại SN.exe -k key.snk, và thenpress ENTER.
  5. Loại CSC /t:library /r:system.web.dll,system.dll/keyfile:key.snk UnhandledExceptionModule.cs, và sau đó pressENTER.
  6. Loại gacutil.exe /ifUnhandledExceptionModule.dll, và sau đó nhấn ENTER.
  7. Loại NGEN installUnhandledExceptionModule.dll, và sau đó nhấn ENTER.
  8. Loại gacutil /lUnhandledExceptionModule, và sau đó nhấn ENTER để hiển thị thestrong tên cho các tập tin UnhandledExceptionModule .
  9. 9. Thêm mã sau vào tập tin Web.config của yourASP.NET dựa trên ứng dụng.
    <add name="UnhandledExceptionModule" 	type="WebMonitor.UnhandledExceptionModule, <strong name>" />

Phương pháp 2

Thay đổi chính sách ngoại lệ không được quay lại chế độ mặc định xảy ra NET Framework 1.1 và Khuôn khổ .NET 1.0.

Lưu ý Chúng tôi không khuyên rằng bạn thay đổi chế độ mặc định. Nếu bạn bỏ qua ngoại lệ, các ứng dụng có thể rò rỉ tài nguyên và bỏ khóa.

Để kích hoạt chế độ mặc định này, thêm mã sau đây để các tập tin Aspnet.config được đặt trong cặp sau:
%WINDIR%\Microsoft.NET\Framework\v2.0.50727
<configuration>    <runtime>        <legacyUnhandledExceptionPolicy enabled="true" />    </runtime></configuration>
Tình trạng
Hành vi này là do thiết kế.
Thông tin thêm
Để biết thêm chi tiết về những thay đổi trong Khuôn khổ .NET 2.0, hãy vào web site Microsoft Developer Network (MSDN) sau đây:
tai nạn

Cảnh báo: Bài viết này đã được dịch tự động

Thuộc tính

ID Bài viết: 911816 - Xem lại Lần cuối: 10/09/2013 06:52:00 - Bản sửa đổi: 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 KbMtvi
Phản hồi