2015-09-01 5 views
1

Я разрабатываю журнал, который требует сохранения всех запросов к db. Я создал собственный фильтр и зарегистрировал его, но он не будет звонить, когда я запрашиваю контроллер.Пользовательские фильтры WebApi

здесь является LogFilter.cs

public class LogFilter : System.Web.Http.Filters.FilterAttribute, IFilter 
{ 
    public void OnActionExecuting(ActionExecutedContext filterContext) 
    { 
     try 
     { 
      string entity = ""; 
      using (StreamReader sr = new StreamReader(filterContext.HttpContext.Request.InputStream)) 
      { 
       entity = sr.ReadToEnd(); 
      } 

      logModel.RequestLog rl = new logModel.RequestLog(); 
      rl.IP = filterContext.HttpContext.Request.UserHostAddress; 
      rl.Type = filterContext.Controller.ControllerContext.RouteData.Values["controller"].ToString().ToUpper(); 
      rl.URL = filterContext.HttpContext.Request.Url.OriginalString; 
      rl.Operation = filterContext.HttpContext.Request.HttpMethod; 
      rl.RequestDate = DateTime.Now; 
      if (!string.IsNullOrEmpty(entity)) 
       rl.Entity = entity; 

      filterContext.HttpContext.Request.Cookies.Add(new HttpCookie("reqID", new deviceLog.RequestLog().Add(rl).ID.ToString())); 
     } 
     catch { } 
    } 

Global.asax

protected void Application_Start() 
    { 
     GlobalConfiguration.Configure(WebApiConfig.Register); 


     WebApiConfig.RegisterGlobalFilters(GlobalConfiguration.Configuration.Filters); 
    } 

WebApiConfig.cs

public static void Register(HttpConfiguration config) 
    { 
     config.Routes.MapHttpRoute(
      name: DEFAULT_API_NAME, 
      routeTemplate: DEFAULT_API_ROUTE, 
      defaults: new 
      { 
       parameter1st = RouteParameter.Optional, 
       parameter2nd = RouteParameter.Optional, 
       parameter3rd = RouteParameter.Optional 
      } 
     ); 

     // remove support for xml 
     config.Formatters.Remove(config.Formatters.XmlFormatter); 

     // force json indentation 
     config.Formatters.JsonFormatter.Indent = true; 
    } 
    public static void RegisterGlobalFilters(System.Web.Http.Filters.HttpFilterCollection filters) 
    { 
     filters.Add(new LogFilter()); 
    } 
+0

Если не 'OnActionExecuting' быть' override'? Если это не переопределяет метод базового класса, то никто никогда не узнает, чтобы назвать его. – David

ответ

2

Вам требуется HttpActionContext для Web Api под System.Web.Http.Filters имен:

public override void OnActionExecuting(HttpActionContext actionExecutedContext) 
{ 
    base.OnActionExecuted(actionExecutedContext); 
} 

Обратите внимание override здесь

+0

Я изменил HttpActionExecutedContext и переопределил метод, но он выдает ошибку Device.WebAPI.Classes.Filters.LogFilter.OnActionExecuting (System.Web.Http.Filters.HttpActionExecutedContext) ': не найдено подходящего метода для переопределения –

+0

@RobsonGmack: Ну атрибут должен переопределить * что-то *, чтобы фреймворк использовал его. Может быть, метод называется чем-то другим? Может быть, вам нужно реализовать другой базовый класс? – David

+0

нашел проблему, у которой есть параметр HttpActionContext, а не HttpActionExecutedContext, tnx для справки: D –

Смежные вопросы