WebApi自定义过滤器

本文关键字:过滤器 自定义 WebApi | 更新日期: 2023-09-27 18:10:52

我正在开发一个需要将所有请求保存到db的日志。我创建了一个自定义过滤器并注册了它,但是当我请求控制器时它不会调用。

这里是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());
    }

WebApi自定义过滤器

System.Web.Http.Filters命名空间下的Web Api需要HttpActionContext:

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

还请注意这里的override