2015-09-24 21 views
10

Tôi có dự án ASP WebAPI. Tôi đang cố gắng để thiết lập một xử lý ngoại lệ toàn cầu trên basecontroller của tôi. Vì vậy, tôi đã tạo một ExceptionFilterAttribute như vậy.Xử lý ngoại lệ toàn cầu của WebAPI

using System.Web.Http.Filters; 

public class MyExceptionFilterAttribute : ExceptionFilterAttribute 
{ 
    protected static readonly ILog log = LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); 

    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     var exception = actionExecutedContext.Exception; 
     log.Fatal(exception); 

     base.OnException(actionExecutedContext); 
    } 
} 

Sau đó, tôi cũng đã đăng ký nó trong /App_Start/WebApiConfig.cs

public static class WebApiConfig 
{ 
    public static void Register(HttpConfiguration config) 
    { 
     // ... 

     // Setup Filters 
     config.Filters.Add(new MyExceptionFilterAttribute()); 
    } 
} 

Khi tôi thêm các thuộc tính để điều khiển của tôi (hoặc cơ sở-controller), không có gì được ghi lại. Tôi đang làm gì sai?

Chỉnh sửa: điều khiển của tôi ném ngoại lệ:

[HttpGet] 
public string Hello(string name) 
{ 
    if (name.Equals("error", StringComparison.OrdinalIgnoreCase)) 
    { 
     throw new HttpResponseException(HttpStatusCode.InternalServerError); 
    } 
    else 
    { 
     return name; 
    } 
} 
+0

loại ngoại lệ nào bạn bỏ qua, có số trường hợp bộ lọc không xử lý được. –

Trả lời

7

Giống như @ShekharPankaj đã chỉ ra, không phải tất cả ngoại lệ đều được xử lý bởi thuộc tính (hoặc cách tiếp cận @ Matías được cung cấp). Mã của tôi đã ổn. Tôi đơn giản thay đổi ngoại lệ thành ArgumentException và nó được xử lý.

cũng Xem này SO-chủ đề: catch all unhandled exceptions in ASP.NET Web Api

Để trả lời câu hỏi của riêng tôi, đây là không thể!

Xử lý tất cả các trường hợp ngoại lệ mà gây ra lỗi máy chủ nội bộ có vẻ như một khả năng cơ bản Web API cần phải có, vì vậy tôi đã đưa ra yêu cầu với Microsoft cho một lỗi xử lý toàn cầu cho Web API:

https://aspnetwebstack.codeplex.com/workitem/1001

Nếu bạn đồng ý, hãy vào liên kết đó và bỏ phiếu cho nó!

Trong thời gian chờ đợi, bài viết xuất sắc ASP.NET Web API ngoại lệ Xử lý hiển thị một số cách khác nhau để nắm bắt một vài loại lỗi khác nhau . Đó là phức tạp hơn nó nên được, và nó không bắt tất cả các lỗi máy chủ interal, nhưng đó là cách tiếp cận tốt nhất có sẵn ngày hôm nay.

Cập nhật: Xử lý lỗi toàn cầu hiện được triển khai và có sẵn trong các bản dựng hàng đêm! Nó sẽ được phát hành trong ASP.NET MVC v5.1. Dưới đây là cách nó sẽ hoạt động: https://aspnetwebstack.codeplex.com/wikipage?title=Global%20Error%20Handling

5

Thực ra khi bạn thêm bộ lọc để HttpConfiguration của bạn thì có nghĩa là nó sẽ được thực hiện đối với bất kỳ hành động. Tức là, bạn không cần phải thêm toàn bộ thuộc tính vào bộ điều khiển API của mình.

Điều gì có thể bỏ qua bộ lọc của bạn? Bộ lọc khác. Bộ lọc đầu tiên để thiết lập các phản ứng thắng và nó có thể xảy ra rằng hành động chính nó sẽ không bao giờ được thực hiện.

Dù sao, có lẽ bạn cần phải chuyển sang thực hiện một IExceptionHandler và cấu hình nó như sau:

config.Services.Replace(typeof(IExceptionHandler), new MyExceptionHandler()); 

Cách tiếp cận này là tốt hơn bởi vì đó là một ngoại lệ xử lý cuối cùng cơ hội thực sự và nó sẽ luôn luôn được gọi là độc lập với hành vi của các bộ lọc.

+0

Tôi thích cách tiếp cận nhưng nó cũng hoạt động cho các phương pháp không đồng bộ không? Phương pháp duy nhất tôi cần thực hiện là 'Task HandleAsync()' – Thijs

+0

@Thijs Yeah, nó hoàn toàn toàn cầu –

+0

Bởi vì trình gỡ lỗi không nhập phương thức khi tôi ném ngoại lệ. – Thijs