2012-04-24 3 views
48

Tôi mới làm quen với toàn bộ điều MVC và đang xem xét việc triển khai lại một số dịch vụ WCF bằng ASP.NET Web API. Là một phần của điều đó, tôi muốn thực hiện một bộ lọc hành động ghi lại tất cả các hành động và ngoại lệ cũng như thời gian nên tôi nghĩ tôi sẽ bắt đầu với Bộ lọc hành động, tuy nhiên bộ lọc không được gọi.Ví dụ về ASP.NET Web API ActionFilter

public class MyTrackingActionFilter : ActionFilterAttribute, IExceptionFilter 
{ 
    private Stopwatch stopwatch = new Stopwatch(); 

    public void OnException(ExceptionContext filterContext) 
    { 
      ... 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
      ... 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     this.stopwatch.Start(); 
     Trace.TraceInformation(" Entering {0}", filterContext.RouteData); 
    } 

}

và trên bộ điều khiển, tôi có

[MyTrackingActionFilter] 
public class MyResourceController : ApiController 
{ 
    ... 
} 

Các tuyến đường được thiết lập trong Global.asax sử dụng cuộc gọi như:

var routeTemplate = ... 
var defaults = new { controller = controllerName, action = methodName }; 
var constraints = new { httpMethod = new HttpMethodConstraint(myHTTPMethods.Split(',')) }; 

routes.MapHttpRoute(methodName, routeTemplate, defaults, constraints); 

Vấn đề là các các hành động trên MyResourceController được gọi như mong đợi và chạy thành công. Khách hàng có thể truy vấn máy chủ để biết thông tin cần thiết và tất cả đều hoạt động tốt, ngoại trừ việc không có phương thức lọc hành động nào được gọi.

Sự hiểu biết của tôi là phần còn lại xảy ra "tự động". Điều đó rõ ràng là không đủ - Bất kỳ sugestions như những gì là sai? Tôi có cần đăng ký ở đâu đó không?

+0

LƯU Ý: Tôi đã thử thêm thuộc tính cho cả thao tác cũng như lớp và cách thức không hoạt động. – WildeButNotOscar

+0

Đảm bảo 100% các lớp liên quan đến Bộ điều khiển API của bạn sử dụng ActionFilter từ System.Web.HttpFilters và KHÔNG phải là một từ System.Web.Mvc –

+0

Ở trên cùng, bạn sẽ thấy một cái gì đó như: using System.Web.HttpFilters; –

Trả lời

169

Bạn phải chắc chắn rằng mã của bạn sử dụng ActionFilterAttribute từ namespace System.Web.Http.Filters và không phải là một từ System.Web.Mvc.

Vì vậy, hãy kiểm tra xem bạn có

using System.Web.Http.Filters; 
+0

Tôi đang tìm cách ghi nhật ký tất cả các yêu cầu và phân tích chúng? là câu hỏi này và câu trả lời này về nhu cầu của tôi? Nếu có? làm sao ? tôi có thể làm điều đó? –

+1

@sabertabatabaeeyazdi bạn có thể sử dụng bộ lọc hành động để ghi nhật ký – dotnetguy

+0

Đối với những người tự hỏi, hãy sử dụng System.Web.Mvc nếu bạn đang xây dựng ứng dụng Mvc và sử dụng System.Web.Http.Filters nếu bạn đang xây dựng Web Api (bộ điều khiển được kế thừa từ ApiController) – suhendri

0

Như Sander nói tôi thử đoạn code dưới đây, lọc hành động của nó là nhận được thực thi.

public class WebAPIActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute 
{ 
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) 
    { 
     PersonController.Messages.Add("OnActionExecuted"); 
    } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     PersonController.Messages.Add("OnActionExecuting"); 
    } 
} 

public class WebAPIExceptionFilter : System.Web.Http.Filters.ExceptionFilterAttribute 
{ 
    public override void OnException(HttpActionExecutedContext actionExecutedContext) 
    { 
     PersonController.Messages.Add("OnException"); 
     actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("Something went wrong") }; 
    } 
} 

PersonController.Messages là danh sách chuỗi tĩnh. nếu bạn muốn kiểm tra xem OnActionExecuted có được thực thi hay không, bạn có thể gọi lại cùng một phương thức API, bạn sẽ thấy "OnActionExecuted" trong danh sách Messages.