2010-02-01 28 views

Trả lời

23

Dịch vụ web ASP.NET không bao giờ bắn Application_Error sự kiện và ngoại lệ không thể được xử lý trên toàn cầu bởi ELMAH như trong các ứng dụng ASP.NET. Nhưng chúng ta có thể "bằng tay" đăng nhập ngoại lệ sử dụng ELMAH:

 

public int WebServiceMethod() { 
    try { 
    ... 
    } 
    catch (Exception ex) { 
    Elmah.ErrorLog.GetDefault(
     HttpContext.Current).Log(new Elmah.Error(ex, HttpContext.Current)); 
    } 
} 
 
+0

Đó là những gì tôi nghĩ nhưng tôi đã kiểm tra nếu có một "sạch" giải pháp. Cảm ơn –

+0

Vâng, giải pháp hoặc thực hành sạch hơn cũng sẽ rất thú vị đối với tôi. Và đây là câu hỏi hay (+1). –

+0

Cuối cùng tôi đã sử dụng giải pháp của bạn, tôi đã không tìm ra cách tốt hơn để làm điều đó. Cảm ơn gợi ý. –

23

Bạn có thể sử dụng một SoapExtension để làm điều này:

using System; 
using System.Web.Services.Protocols; 

namespace MyNamespace 
{ 
    class ELMAHExtension : SoapExtension 
    { 
     public override object GetInitializer(Type serviceType) 
     { return null; } 

     public override object GetInitializer(LogicalMethodInfo methodInfo, SoapExtensionAttribute attribute) 
     { return null; } 

     public override void Initialize(object initializer) 
     { } 

     public override void ProcessMessage(SoapMessage message) 
     { 
      if (message.Stage == SoapMessageStage.AfterSerialize && 
       message.Exception != null) 
      { 
       // Log exception here 
      } 
     } 
    } 
} 

Bạn đăng ký này trong web.config với những dòng sau:

<system.web> 
    <webServices> 
    <soapExtensionTypes> 
     <add type="MyNamespace.ELMAHExtension, MyDLL" priority="1" group="1" /> 
    </soapExtensionTypes> 
    </webServices> 
</system.web> 

Điều này sẽ cung cấp cho bạn quyền truy cập vào các đối tượng HttpContext và SoapMessage sẽ cung cấp cho bạn tất cả chi tiết bạn cần về những gì đang được gọi. Tôi nghĩ rằng ngoại lệ bạn truy xuất ở giai đoạn này sẽ luôn là một SoapException và rằng bit bạn quan tâm có lẽ là ngoại lệ bên trong.

+0

Cảm ơn, tôi sẽ thử. –

+1

havent đã có cơ hội để thử điều này, nhưng nó trông giống như nó sẽ làm việc. Trường hợp nó nói 'đăng nhập ngoại lệ ở đây' mã 'Elmah.ErrorLog.GetDefault ( HttpContext.Current) .Log (new Elmah.Error (ví dụ, HttpContext.Current)); 'có thể làm các trick. – codeulike

+0

Nó hoạt động, trên thực tế. – avesse

0

Bạn có thể sử dụng mã này

try{ 
// your code in here 
} 
    catch (Exception ert) 
      { 
       Elmah.ErrorSignal.FromCurrentContext().Raise(ert); 

      } 
Các vấn đề liên quan