webapi 过滤器的使用

参考博客:https://www.cnblogs.com/WJ--NET/p/7878286.html

关于日志的过滤:

AuthExceptionFilter.cs:
using FirstDemo.Models;
using Newtonsoft.Json;
using System.Net.Http;
using System.Text;
using System.Web.Http.Filters;

namespace FirstDemo.Filter
{
    /// <summary>
    /// 设置过滤器
    /// </summary>
    public class AuthExceptionFilter:ExceptionFilterAttribute
    {
        public override void OnException(HttpActionExecutedContext actionExecutedContext)
        {
            //base.OnException(actionExecutedContext);
            // 返回500状态码,表示服务器发生错误
            actionExecutedContext.Response = new System.Net.Http.HttpResponseMessage(System.Net.HttpStatusCode.InternalServerError);
            // 设置返回消息
            string l_strMsg = JsonConvert.SerializeObject(new ResultModel<object>() { ReturnCode = 0, Message = "处理异常", Result = "" });
            // 写入日志
            LogModel.WriteLogError(l_strMsg);
            // 返回结果
            actionExecutedContext.Response.Content = new StringContent(l_strMsg, Encoding.UTF8);
        }
    }
}
控制器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using FirstDemo.Entity;
using FirstDemo.Models;
using System.Data;
using Newtonsoft.Json;
using FirstDemo.Filter;

namespace FirstDemo.Controllers
{
    [AuthExceptionFilter]
    public class IndexController : ApiController
    {
        #region get请求,获取页面数据
        [HttpGet]
        public HttpResponseMessage Get()
        {
            try
            {
                throw new Exception("模拟错误");
            }
            catch(Exception err)
            {
                throw (err);
            }
            ...
        }
        #endregion
    }
}
                
日志Model:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace FirstDemo.Models
{
    public static class LogModel
    {
        private static readonly log4net.ILog m_logger = log4net.LogManager.GetLogger("LogModel");
        
        public static void WriteLogError(string a_strMsg)
        {
            m_logger.Error(a_strMsg);
        }
    }
}
响应信息model:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace FirstDemo.Models
{
    public class ResultModel<T> where T :class
    {
        // 状态码
        public int ReturnCode { get; set; }

        // 附加消息
        public string Message { get; set; }

        // 附加数据
        public T Result { get; set; }
    }
}
Log4net.config:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <system.web>
      <compilation debug="true" targetFramework="4.5.2" />
      <httpRuntime targetFramework="4.5.2" />
    </system.web>
    <log4net>
      <!--记录所有的完整日志-->
      <appender name="AllLogFileAppender" type="log4net.Appender.RollingFileAppender">
        <!--或者是文件名或是文件夹(没有后缀)-->
        <file value="log/all/log_" />
        <!--是否总是写在一个文件里-->
        <staticLogFileName value="false" />
        <!-- 是否追加到文件中 -->
        <appendToFile value="true" />
        <!--可设置为Size、Date,即大小/日期超出一定范围后就新建一个日志文件-->
        <rollingStyle value="Date" />
        <!--一天最多保存多少-->
        <maxSizeRollBackups value="50" />
        <!--每个文件最大大小,单位可是MB,KB-->
        <maximumFileSize value="5MB" />
        <!--设置用来生产文件的日期格式-->
        <datePattern value="yyyy-MM-dd'.log'"/>
        <!--日志输入的通用格式(日志的内容格式)-->
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter,log4net">
          <levelMin value="DEBUG" />
          <levelMax value="FATAL" />
        </filter>
      </appender>

      <!--记录错误日志,这些错误往往是一个程序bug或是要注意的-->
      <appender name="ErrorLogFileAppender" type="log4net.Appender.RollingFileAppender">
        <!--或者是文件名或是文件夹(没有后缀)-->
        <file value="log/error/error_" />
        <!--是否总是写在一个文件里-->
        <staticLogFileName value="false" />
        <appendToFile value="true" />
        <!--可设置为Size、Date,即大小/日期超出一定范围后就新建一个日志文件-->
        <rollingStyle value="Date" />
        <!--一天最多保存多少-->
        <maxSizeRollBackups value="50" />
        <!--每个文件最大大小,单位可是MB,KB-->
        <maximumFileSize value="5MB" />
        <!--设置用来生产文件的日期格式-->
        <datePattern value="yyyy-MM-dd'.log'"/>
        <!--日志输入的通用格式(日志的内容格式)-->
        <layout type="log4net.Layout.PatternLayout">
          <conversionPattern value="%date [%thread] %-5level %logger [%property{NDC}] - %message%newline" />
        </layout>
        <filter type="log4net.Filter.LevelRangeFilter,log4net">
          <levelMin value="ERROR" />
          <levelMax value="FATAL" />
        </filter>
      </appender>
      <!--Set root logger level to DEBUG and its only appender to A1-->
      <root>
        <!--控制级别,由低到高: ALL|DEBUG|INFO|WARN|ERROR|FATAL|OFF-->
        <level value="ALL" />
        <appender-ref ref="AllLogFileAppender" />
        <appender-ref ref="ErrorLogFileAppender" />
      </root>
    </log4net>
</configuration>

 action过滤器:

ActionFilter.cs过滤器
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Http.Controllers;
using System.Web.Http.Filters;

namespace FirstDemo.Filter
{
    public class ActionFilter:ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            //base.OnActionExecuting(actionContext);
            // 添加在方法执行前需要处理的代码
        }
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            //base.OnActionExecuted(actionExecutedContext);
            // 添加在方法执行后需要处理的代码
        }
    }
}
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web.Http;
using FirstDemo.Entity;
using FirstDemo.Models;
using System.Data;
using Newtonsoft.Json;
using FirstDemo.Filter;

namespace FirstDemo.Controllers
{
    [ActionFilter]  // 添加action过滤器
    [AuthExceptionFilter]
    public class IndexController : ApiController
    {
        #region get请求,获取页面数据
        [HttpGet]
        public HttpResponseMessage Get()
        {
        }
        #endregion
    }
}

///

原文地址:https://www.cnblogs.com/namejr/p/11221016.html