2012-04-08 23 views
12

Sử dụng bộ điều khiển API trong MVC4, khi hành động bộ điều khiển ném ngoại lệ, ELMAH không ghi lỗi. Tôi nghĩ rằng vấn đề là MVC4 đặt mã trạng thái HTTP là 500, và nó trả về các chi tiết ngoại lệ trong một đối tượng JSON, nhưng nó không ném một ngoại lệ chưa được xử lý để ELMAH không bao giờ nhìn thấy nó.ELMAH và bộ điều khiển API trong MVC4 không ghi nhật ký lỗi

Tôi làm cách nào để ELMAH nắm bắt tất cả các phản hồi trong đó mã trạng thái không phải là 200?

+3

Có lẽ đáng chú ý là bộ điều khiển API là trong Web API, không MVC. Các đường dẫn thực thi riêng biệt cho mỗi thường là nguyên nhân của sự không tương thích của một thư viện được MVC nhắm mục tiêu với API Web. Mỗi yêu cầu hoặc đi MVC, hoặc nó đi Web API. Hai bên cạnh nhau và không tương tác (Web API không phải là một tính năng bên trong thực thi MVC). Chúng có các ngữ cảnh khác nhau, các bảng định tuyến khác nhau, các cấu hình khác nhau, tất cả khác nhau, tất cả đều riêng biệt. – StarTrekRedneck

Trả lời

22

Các anwser được mô tả trước đây không hoạt động. Tôi đã thử trên máy chủ thử nghiệm của tôi và nhận được một lỗi ("Ví dụ bộ lọc đã cho phải thực hiện một hoặc nhiều giao diện bộ lọc sau: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.")

Sau đó, tôi nhận ra điều gì đã xảy ra .. .. bạn đang cố gắng để thêm bộ lọc tùy chỉnh để các MVC Lọc toàn cầu (filters.Add (mới ElmahHandledErrorLoggerFilter());)

để khắc phục điều đó, tôi đã chia việc đăng ký bộ lọc trong GlobalFilter và HttpFilter

FilterConfig.cs

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

    public static void RegisterHttpFilters(HttpFilterCollection filters) 
    { 
     filters.Add(new ElmahHandledErrorLoggerFilter()); 
    } 

Global.asax

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
    FilterConfig.RegisterHttpFilters(GlobalConfiguration.Configuration.Filters); 

;-)

+0

Điều này có hiệu quả, cảm ơn bạn. – jhilden

+2

Với giàn giáo hiện tại của Web API, bộ lọc nên được đăng ký trong App_Start/WebApiConfig.cs. config.Filters.Add (new ElmahExceptionFilter()); –

+0

Tôi vừa cài đặt qua nuget Elmah.MVC. siêu dễ dàng để có được đi, nhưng, không đăng nhập 500 lỗi. Tôi hiểu câu trả lời ở trên, nhưng, không thấy các ElmahHandledErrorLoggerFilter (được hiển thị trong đoạn mã trên) trong Elmah của tôi. * Hoặc Elmah.Mvc. * Không gian EDIT: oops, tôi thấy bây giờ .. đó là một lớp học mà bạn viết cho mình .. và nó được hiển thị trong đoạn mã của OP. Lấy làm tiếc! ;) – bkwdesign

16

CẬP NHẬT: Câu trả lời này không hoạt động trong các phiên bản mới nhất. Sử dụng câu trả lời của julianox.

trả lời tìm thấy từ các thông tin ở đây: http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

Trường hợp bản ghi lọc ngoại lệ đối với ELMAH:

public class ElmahHandledErrorLoggerFilter : ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     base.OnException(actionExecutedContext); 

     ErrorSignal.FromCurrentContext().Raise(actionExecutedContext.Exception); 
    } 
} 

nhưng bạn cũng phải thêm bộ lọc lỗi để các bộ lọc GlobalConfiguration:

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter()); 
     filters.Add(new ElmahHandledErrorLoggerFilter()); 
     filters.Add(new HandleErrorAttribute()); 
    } 
+0

Công cụ tuyệt vời. Tôi đã vật lộn với điều này và không thêm bộ lọc Elmah vào GlobalConfiguration. –

+1

Khi tôi làm điều này, nó không hoạt động chút nào trừ khi tôi thêm GlobalConfiguration.Configuration.Filters.Add (new ElmahHandledErrorLoggerFilter()); trong phương thức RegisterGlobalFilters. Không nên các bộ lọc.Thêm (mới ElmahHandledErrorLoggerFilter()); dòng đã làm nó? Điểm của cả hai là gì? – JustinP8

+0

@ JustinP8 WebApi gần như đã hoàn toàn tái tạo một số thứ đã có trong MVC. Mặc dù điều này là bực bội, bạn có thể thấy rằng WebApi và MVC là các ký tự khác nhau - một giao diện người dùng định hướng phần mềm khác được định hướng. Nếu bạn kiểm tra các kiểu được trả về bởi GlobalConfiguration.Configuration.Filters (HttpFilterCollection) và GlobalFilters.Filters (GlobalFilterCollection), bạn có thể thấy chúng là những con thú khác nhau. – WooWaaBob

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