zoukankan      html  css  js  c++  java
  • 【WebApi】利用ActionFilterAttribute记录客户端请求及返回信息

    需求: 
    记录每个接口的请求参数及返回参数,方便以后回溯 

    filter的介绍 
    filter在Web API中经常会用到,主要用于记录日志,安全验证,全局错误处理等;Web API提供两种过滤器的基本类型:actionfilterattribute,exceptionfilterattribute;两个类都是抽象类,actionfilter主要实现执行请求方法体之前(覆盖基类方法OnActionExecuting),和之后的事件处理(覆盖基类方法OnActionExecuted);exceptionfilter主要实现触发异常方法(覆盖基类方法OnException)。 

    下来就是写个信的filter来扑捉请求的和返回的信息,如下代码:

    public class WebApiActionDebugFilter : System.Web.Http.Filters.ActionFilterAttribute  
        {  
            /// <summary>  
            /// 是否开启调试  
            /// </summary>  
            private bool _isDebugLog = true;  
      
            public string DebugId  
            {  
                set  
                {  
                    var session = System.Web.HttpContext.Current.Session;  
                    if (session != null)  
                    {  
                        session["RequestDebugId"] = value;  
                    }  
                }  
                get  
                {  
                    var session = System.Web.HttpContext.Current.Session;  
                    if (session != null && session["RequestDebugId"]!=null)  
                    {  
                        return session["RequestDebugId"].ToString();  
                    }  
                    return string.Empty;  
                }  
            }  
      
            public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext context)  
            {  
                base.OnActionExecuting(context);  
                //记录请求内容  
                if (_isDebugLog)  
                {  
                    try  
                    {  
                        var guid = System.Guid.NewGuid().ToString();  
                        DebugId = guid;  
                        var session = System.Web.HttpContext.Current.Session;  
                        var request = System.Web.HttpContext.Current.Request;  
                        var keys = request.Form.AllKeys;  
                          
                        var task = context.Request.Content.ReadAsStreamAsync();  
                        var content = string.Empty;  
                        using (System.IO.Stream sm = task.Result)  
                        {  
                            if (sm != null)  
                            {  
                                sm.Seek(0, SeekOrigin.Begin);  
                                int len = (int) sm.Length;  
                                byte[] inputByts = new byte[len];  
                                sm.Read(inputByts, 0, len);  
                                sm.Close();  
                                content = Encoding.UTF8.GetString(inputByts);  
                            }  
                        }  
                        string pars = string.Format("请求:
     id = {3};
     sessionId = {0};
     url = {1};
     contentType = {4};
     content = {2};"  
                            ,""// (session==null)?"...":session.SessionID  
                            , request.RawUrl  
                            , content  
                            , guid  
                            , request.ContentType);  
      
                    }  
                    catch (Exception ex)  
                    {  
                    }  
                }  
            }  
            public override void OnActionExecuted(System.Web.Http.Filters.HttpActionExecutedContext context)  
            {  
                base.OnActionExecuted(context);  
                //记录返回内容  
                if (_isDebugLog)  
                {  
                    try  
                    {  
                        var session = System.Web.HttpContext.Current.Session;  
                        var task = context.Response.Content.ReadAsStringAsync();  
                        var txt = task.Result;  
                        string pars = string.Format("响应:
     id = {2};
     sessionId = {0};
     response = {1}"  
                            , ""//(session == null) ? "..." : session.SessionID  
                            , txt  
                            , DebugId);  
                    }  
                    catch (Exception ex)  
                    {  
                    }  
                }  
            }  
              
        }  

     可能出现的问题: 


    注册WebApiActionDebugFilter时将它写在了FilterConfig文件中 
    运行时出现的错误提示: 
    给定的筛选器实例必须实现以下一个或多个筛选器接口: System.Web.Mvc.IAuthorizationFilter、System.Web.Mvc.IActionFilter、System.We 

    原因:FilterConfig是给MVC使用的,api用的是webapiconfig 


    参考学习: 
    https://www.cnblogs.com/mychris/p/5157655.html 
    https://www.cnblogs.com/duanjt/p/6734372.html 
    http://blog.csdn.net/xxj_jing/article/details/48806829 
    https://www.cnblogs.com/shi-meng/p/4635571.html

  • 相关阅读:
    Linux程序调试GDB——数据查看
    linux C++ 共享库导出类
    MyBatis 通用Mapper接口 Example的实例
    mybatis3 @SelectProvider
    Maven命令行使用 mvn clean package
    Springboot IDEA eclipse 打包
    Intellij IDEA Debug
    SpringCloud之Eureka 服务注册和服务发现基础篇2
    SpringCloud组件和概念介绍1
    IntelliJ IDEA SVN
  • 原文地址:https://www.cnblogs.com/yhnet/p/12713848.html
Copyright © 2011-2022 走看看