`

webapi记录请求和返回日志

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

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("请求:\r\n id = {3};\r\n sessionId = {0};\r\n url = {1};\r\n contentType = {4};\r\n 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("响应:\r\n id = {2};\r\n sessionId = {0};\r\n response = {1}"  
                        , ""//(session == null) ? "..." : session.SessionID  
                        , txt  
                        , DebugId);  
                }  
                catch (Exception ex)  
                {  
                }  
            }  
        }  
          
    }  



使用方式:
1、在每个方法添加此属性[WebApiActionDebugFilter]
2、在webapi的路由配置里增加
 config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "WebApi/{controller}/{action}/{id}",
                defaults: new { id = RouteParameter.Optional }

            );

            //注册
            config.Filters.Add(new WebApiActionDebugFilter());

可能出现的问题:


注册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
分享到:
评论

相关推荐

    C# WebAPI示例

    9. **测试(Testing)**:WebAPI易于测试,可以通过模拟HTTP请求库如`HttpClient`进行单元测试和集成测试。 10. **版本控制(Versioning)**:在大型项目中,版本控制是必须的。可以通过URL路径、请求头或查询字符...

    Web api之post请求示例代码,亲测可用

    在Web开发领域,Web API是用于构建服务端应用程序的关键组件,它允许客户端通过HTTP协议进行数据交互。在本文中,我们将深入探讨...通过理解这些基本概念和示例代码,你可以更好地理解和实现Web API中的POST请求功能。

    WebAPIDemo.rar_c# web api

    7. **过滤器(Filters)**:Web API支持过滤器,如授权、异常处理和日志记录,这些都是可重用的代码段,可以应用于多个控制器方法。 8. **媒体类型格式化(Media Type Formatters)**:Web API提供了媒体类型格式化...

    WebAPI项目及其HTML测试页面

    控制器处理HTTP请求,路由决定哪些请求应由哪个控制器处理,模型绑定将请求数据绑定到控制器方法的参数,而动作筛选器则可以用来执行全局性的任务,如身份验证和日志记录。 2. **发布到IIS服务器**:IIS(Internet ...

    ASP.NET Web API 2 框架揭秘,带完整目录和源码

    4. **过滤器**:Web API 2 提供了过滤器系统,如授权过滤器、异常过滤器和日志记录过滤器,使得开发者可以通过全局或特定操作应用统一的行为逻辑。 5. **OData支持**:ASP.NET Web API 2 支持OData协议,允许客户端...

    .net core WebApi 文件上传服务文件下载

    5. **错误处理和日志记录**:确保捕获并记录上传和下载过程中出现的任何错误,以方便调试和监控系统健康状况。 在提供的`UploadServer-master`压缩包中,可能包含了示例代码,包括了实现上述功能的控制器、模型、...

    如何在WPF应用程序中通过HttpClient调用Web API

    // 记录日志或显示错误信息 Debug.WriteLine(ex.Message); return null; } } } ``` 在WPF界面控件(如按钮)的事件处理程序中,你可以调用这个方法,并使用await关键字等待异步操作完成,同时更新UI: ```...

    asp.net webApi

    5. **HTTP消息处理(Message Handlers)**:消息处理器是WebAPI中处理请求和响应的中间件层。它们可以用来进行身份验证、日志记录、格式化响应等任务,按照注册顺序逐个处理请求和响应。 6. **媒体类型格式化...

    使用ASP.NET Core 5.0构建WebApi框架源码

    在ASP.NET Core中,WebAPI用于构建RESTful API服务,可以处理HTTP请求并返回数据。 创建一个新的ASP.NET Core Web API项目,我们首先要安装.NET Core SDK,然后使用命令行工具`dotnet new webapi -n MyApi`来初始化...

    WebApi-示例.rar

    WebApi 示例是一个基于C#开发的应用程序,展示了如何利用ASP.NET Web API框架构建RESTful服务。Web API是Microsoft为构建HTTP服务提供的一种高效且灵活的框架,它支持各种客户端,包括浏览器和移动设备。这个RAR文件...

    ASP.NET Web API

    3. **过滤器**:过滤器是ASP.NET Web API中一种可复用的代码段,可以应用于整个应用、控制器或特定的动作,如身份验证、异常处理和日志记录。 4. **媒体类型格式化**:Web API支持多种数据格式,如JSON和XML,自动...

    ApiServer_WebApi2

    在ApiServer_WebApi2中,ELMAH被集成来收集和记录服务器端的错误信息,帮助开发者追踪和诊断问题。它可以自动捕获、记录并显示HTTP请求期间发生的任何异常,同时提供了查看、搜索和导出日志的功能。 **Owin ...

    WebAPi工具类帮助解决API中的各种方法

    4. **数据序列化与反序列化**:WebAPI通常返回JSON或XML格式的数据,工具类可以帮助我们将对象转换为这些格式,或者从请求中解析出数据对象。例如,我们可以创建一个`JsonHelper`类,包含`ToJson`和`FromJson`方法,...

    .net core webapi通过中间件获取请求和响应内容的方法

    本文主要根据中间件来实现对.net core webapi中产生的请求和响应数据进行获取并存入日志文件中; 这里不详细介绍日志文件的使用。你可以自己接入NLog,log4net,Exceptionless等 创建接口记录的中间件 using ...

    .NET6WebAPI使用Sqlserver+JWT增删改查

    8. **异常处理和错误日志**: 项目中应有适当的错误处理机制,如全局异常过滤器,以捕获并处理可能出现的异常,同时记录错误日志,便于问题排查。 9. **安全性考虑**: 除了JWT身份验证外,项目可能还涉及到其他安全...

    mcv+WebAPI框架

    5. **配置**:Web.config文件通常包含WebAPI的配置信息,如路由规则、日志记录、错误处理等。 6. **过滤器**:过滤器可以应用于控制器或动作,提供跨切面的功能,如授权、缓存、异常处理等。 7. **媒体类型格式化...

    WebApiDemo2017.rar

    通过研究和学习这个WebApiDemo2017项目,开发者不仅可以了解Web API的基本架构,还能掌握如何集成各种实用功能,提升API开发的效率和质量。这是一个很好的学习资源,尤其对于初学者或者希望优化API开发流程的开发者...

    Web Api使用详解(全部实例讲解,可直接运行看效果),可直接运行

    过滤器是一种强大的特性,可以应用于控制器或特定操作,执行预处理或后处理任务,如授权、异常处理和日志记录。例如,`AuthorizeAttribute`用于实现基本的身份验证。 8. **媒体类型格式化(Media Type Formatters...

    Web Api使用详解(全部实例讲解,可直接运行看效果)完整源码

    常见的过滤器包括授权、异常处理和日志记录。 5. **媒体类型格式化**:Web API自动处理输入和输出数据的序列化和反序列化,如JSON或XML。开发者可以通过注册自定义的媒体类型格式化器来扩展这一功能。 6. **响应...

Global site tag (gtag.js) - Google Analytics