6

Vấn đề:Xử lý ngoại lệ trong ASP.NET Web Api 2

tôi cần phải xử lý web api 2 trường hợp ngoại lệ và trả về một đối tượng phong phú với mã trạng thái chính xác (401 cho trái phép, 404 cho ContentNotFound, vv) và một số thông tin bổ sung làm nội dung. Hơn nữa, tôi cần nội dung trông giống như đối tượng Exception được tuần tự hóa (có các thuộc tính message, exceptionMessage, stackTrace, ...).

Solutions Đề xuất:

  1. Tạo lớp ngoại lệ tùy chỉnh và viết một bộ lọc ngoại lệ tùy chỉnh để áp dụng đối với hành động của bất kỳ bộ điều khiển. này bộ lọc tùy chỉnh ngoại lệ xử lý các ngoại lệ ném theo kiểu của nó (một trong những trường hợp ngoại lệ tùy chỉnh mà tôi đã xác định) và phản ứng phù hợp qua một cái gì đó như thế này (mã lọc của):

    context.Response = context.Request.CreateErrorResponse(HttpStatusCode.Unauthorized, 
                new Exception("my exception"))); 
    
  2. gói web đã viết api 2 *ActionResult các lớp học (System.Web.Http.Results.UnauthorizedResult Unauthorized(), System.Web.Http.Results.OkResult Ok(), v.v.) và thêm một số dữ liệu tùy chỉnh vào chúng và sử dụng chúng để kết quả của chúng được truyền cho khách hàng mỗi khi chúng được gọi (sự cố trong trường hợp này là kiểu trả về của hành động của controller là IHttpActionResult không dễ dàng kiểm chứng và có thể đọc được như một hành động được đánh máy mạnh).

tôi nên chọn giải pháp gì? Hay có cách nào khác để làm những gì tôi đang cố đạt được ở đây?

Trả lời

7

Hoặc bạn có thể sử dụng giải pháp tích hợp sẵn trong hộp: exception filters.

Ngoài ra, bạn có thể quan tâm đến số exception handling starting from Web API 2.x.

+0

bài này đã giúp tôi sử dụng ví dụ trên "bộ lọc ngoại lệ" liên kết. – Stuart

+1

@Stuart Đẹp! Tôi vui vì nó đã cho bạn một gợi ý tốt. BTW, tôi sẽ đi với xử lý ngoại lệ để thay thế! http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling –

1

Từ những gì tôi hiểu bạn không muốn xử lý các ngoại lệ được ném bởi mã, thay vì tạo chúng trong các phương thức hành động của bạn. Đối với trường hợp ngoại lệ được ném bởi các khu vực khác trong mã (những thứ khác bạn gọi bên trong hành động của mình hoặc bằng các bộ lọc khác, bạn có thể sử dụng bộ lọc ngoại lệ hoặc xử lý lỗi toàn cục).

Do đó tôi sẽ đi theo phương pháp thứ hai của bạn (mặc dù bạn không cần phải tùy chỉnh kết quả hành động nhiều). Mã của bạn thực sự là dễ dàng hơn nhiều để kiểm tra đơn vị với IHttpActionResult, bởi vì bạn có thể kiểm tra loại kết quả trực tiếp. Trong thực tế, một trong những lý do IHttpActionResults được thêm vào là đơn giản hóa việc kiểm thử đơn vị.

Dòng mã của bạn đơn giản hơn vì bạn không cần phải ném để tạo lỗi và bạn luôn có thể kiểm tra nội dung của một ok (returnValue) như bạn có thể xem bên dưới.

[TestMethod] 
public void GetProduct_ShouldReturnCorrectProduct() 
{ 
    var testProducts = GetTestProducts(); 
    var controller = new SimpleProductController(testProducts); 

    var result = controller.GetProduct(4) as OkNegotiatedContentResult<Product>; 
    Assert.IsNotNull(result); 
    Assert.AreEqual(testProducts[3].Name, result.Content.Name); 
} 

http://www.asp.net/web-api/overview/testing-and-debugging/unit-testing-with-aspnet-web-api