2010-01-21 24 views
42

Tôi sinh ra một luồng trên Application_Start và muốn đăng nhập ngoại lệ. Không có Context/HttpContext/HttpContext.Current, vậy làm cách nào để đăng nhập?elmah: ngoại lệ mà không có HttpContext?

Hiện tại, nó không bắt bất kỳ ngoại lệ nào trong chuỗi của tôi và nếu tôi viết ErrorSignal.FromCurrentContext().Raise(ex); Tôi gặp lỗi về ngữ cảnh không được rỗng.

Có lẽ tôi có thể tạo một HttpContext giả nhưng bằng cách nào đó tôi không nghĩ rằng nó sẽ hoạt động tốt.

-edit- Tôi đã thử ErrorSignal.Get(new HttpApplication()).Raise(ex); và dường như không nhận ngoại lệ đó.

Trả lời

71

Hãy chắc chắn rằng bạn đặt tên ứng dụng của bạn trong web.config

<errorLog type="Elmah.SqlErrorLog, Elmah" 
      connectionStringName="nibWeb" 
      applicationName="Nib.Services" /> 

và sau đó

ErrorLog.GetDefault(null).Log(new Error(error)); 

sẽ làm việc

+0

Cảm ơn bạn! Tôi đánh giá cao nó rất nhiều! –

+0

Làm cách nào để đặt tên ứng dụng của bạn trong web.config? – chobo2

+1

@ chobo2 - Tôi đã chỉnh sửa câu trả lời của Brendan để bạn có thể xem ví dụ web.config của mình – amurra

2

Tôi đã không sử dụng <errorLog> như trong câu trả lời của Brendan Carey vì tôi chỉ ghi trong bộ nhớ. Tuy nhiên, lệnh của ông làm việc rất lớn trong trường hợp của tôi mà không đặt tên cho các ứng dụng:

Elmah.ErrorLog.GetDefault(null).Log(new Elmah.Error(new Exception("The application has done something."))); 

tôi DID phải biên dịch lại ELMAH với .NET 4.0, vì một lỗi về việc cần System.Web.Abstractions 3.5.0.0. compiled-for-.NET 4,0 ngã ba của tôi là ở đây nếu có ai muốn nó (cũng mạnh mẽ đặt tên):

http://code.google.com/r/scottstafford-elmah/

+0

LƯU Ý: Khi tôi chuyển sang sử dụng đăng nhập sql, tôi đã cần ApplicationName. –

1

Đối với ứng dụng của tôi, tôi đã lưu this.Context.ApplicationInstance trong Application_Start vì vậy mà tôi có thể gọi Elmah.ErrorSignal.Get với trường hợp lưu. Với ErrorSignal, tôi có thể sau đó Raise. Điều này đi qua tất cả các bộ lọc email.

Dưới đây là mã. Tôi sử dụng FluentScheduler để

public class Global : HttpApplication { 
    void Application_Start(object sender, EventArgs e) { 

     var application = Context.ApplicationInstance; 
     FluentScheduler.TaskManager.UnobservedTaskException += 
      (FluentScheduler.Model.TaskExceptionInformation i, UnhandledExceptionEventArgs a) => 
       Elmah.ErrorSignal.Get(application).Raise(i.Task.Exception); 

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