2012-06-20 36 views
39

Dường như cả hai đều có mục đích tương tự. Nó sẽ là tuyệt vời để xem một số ví dụ khi sử dụng một trong những khác, thuận và chống, cũng như chỉ ra những khác biệt chính là gì.Khi nào sử dụng HttpMessageHandler vs ActionFilter?

+1

http://forums.asp.net/t/1804456.aspx – user960567

+3

Câu hỏi hay hơn có thể là khi sử dụng HttpMessageHandler so với * ActionFilter * chung. Điều đó có vẻ hơi mơ hồ hơn một chút. Bộ lọc –

Trả lời

53

Sự khác biệt chính giữa hai yếu tố này là trọng tâm của chúng. Thông báo Trình xử lý được áp dụng cho tất cả các yêu cầu HTTP. Họ thực hiện chức năng của một trung gian HTTP. Bộ lọc chỉ áp dụng cho các yêu cầu được gửi đến bộ điều khiển/hành động cụ thể nơi bộ lọc được áp dụng .

Bạn nên sử dụng MessageHandlers khi bạn muốn hành vi được áp dụng cho phần lớn các yêu cầu. Bộ lọc nên được sử dụng khi chúng chỉ áp dụng cho một số tài nguyên nhất định.

enter image description here

+6

cũng có thể được áp dụng cho tất cả các yêu cầu HTTP, nếu chúng được thêm làm bộ lọc chung. – frennky

+2

Đây là từ đâu? –

+2

http://blogs.msdn.com/b/kiranchalla/archive/2012/05/05/asp-net-mvc4-web-api-stack-diagram.aspx –

26

Một sự khác biệt lớn giữa bộ xử lý và bộ lọc hành động là giai đoạn mà họ đang thực hiện. Các bộ lọc hành động được thực hiện sau khi điều khiển và mô hình ràng buộc đã xảy ra, vì vậy bạn có khả năng tương tác với cá thể bộ điều khiển đang xử lý yêu cầu, cũng như có quyền truy cập trực tiếp vào các đối tượng mô hình đã nhập được truyền vào phương thức hành động. Tôi đã sử dụng cách tiếp cận này để thực hiện việc ghi nhật ký các giá trị yêu cầu/đáp ứng nâng cao - bởi vì tôi có thể nhận được bộ điều khiển, tôi có thể ghi lại thông tin bổ sung về cách xử lý yêu cầu.

nhắn xử lý được thực hiện trước đó trong quá trình này, và hoạt động gần gũi hơn với các giá trị yêu cầu thô/phản ứng so với các bộ lọc (đối chiếu các đối tượng HttpRequestMessage/HttpResponseMessage sử dụng trong xử lý với nhiều-giàu HttpActionContext và HttpActionExecutedContext các đối tượng có sẵn trong các bộ lọc). Điều này làm cho chúng có khả năng hiệu quả hơn đối với một số hoạt động, ví dụ, nếu bạn đang cố gắng xác định xem bạn có cần chấm dứt yêu cầu sớm hay không. Nếu bạn biết yêu cầu phải bị từ chối, trình xử lý sẽ cho phép bạn thực hiện việc này trước khi cơ sở hạ tầng WebApi đã đi đến nỗ lực của việc khởi tạo bộ điều khiển, thực hiện mô hình ràng buộc, v.v.

Sự khác biệt là các trình xử lý bị xích và bạn có nhiều quyền kiểm soát hơn về cách chuỗi được thực hiện. Mặc dù các bộ lọc được gọi theo thứ tự, việc thiết lập phản hồi trong một bộ lọc sẽ kết thúc yêu cầu một cách hiệu quả, ngăn không cho bộ lọc tiếp theo trong danh sách được thực thi. Ví dụ, nếu bạn có một bộ lọc đầu tiên trả về một yêu cầu xấu nếu mô hình của bạn là null và bộ lọc thứ hai để ghi lại yêu cầu, bộ lọc thứ hai của bạn sẽ không được thực hiện khi yêu cầu xấu được tạo bởi bộ lọc đầu tiên. Với một trình xử lý, nó vẫn có thể (mặc dù không nhất thiết phải được khuyến khích!) Để gọi trình xử lý bên trong và cho phép chuỗi xử lý hoạt động bình thường.

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