ASP.NET Web API 记录请求响应数据到日志的一个方法
原文:http://blog.bossma.cn/dotnet/asp-net-web-api-log-request-response/
ASP.NET Web API 记录请求响应数据到日志的一个方法
REST风格的服务架构已经成为越来越多人的选择,之前我用过WCF来实现REST服务,WCF是一个很强大的框架,干这点小事有点太沉重的感觉。后来微软又推出了一个ASP.NET Web API,专门用来处理一些基本的Http服务,即灵活又简单,推荐大家都看看。
今天这篇文章是使用ASP.NET Web API过程中的一个小经验,与大家分享。
后台服务通常需要记录一些运行记录,如输入输出、请求信息、处理过程、响应信息等,在以前记录请求数据和响应数据时,我经常在具体的接口方法中处理,如:
/// 账户验证 /// </summary> /// <param name="instance"></param> /// <returns></returns> public LoginResponse UserCheck(UserInfo instance) {LogHelper.LogRequest<UserInfo>(instance);var response = InnerAPI.UserLogin(instance);LogHelper.LogResponse<LoginResponse>(response);return response; }
LogHelper.LogRequest 用于记录请求的数据,LogHelper.LogResponse用于记录返回的数据。
这样处理的话,每个方法中都要重复如此记录,不简洁,不方便,还处于复制代码的阶段。一直想改变,去苦于没有思路。
某一天在博客园看到《ASP.NET Web API 处理架构》,如获至宝。于是开始在Web API的生命周期中寻找可以截获到这些数据的点,最终在官网上找到一篇文章《HTTP Message Handlers》,参考其中的说明,我重新构造了记录输入输出的方法:
/// <summary> /// 消息处理程序 /// </summary> public class CustomMessageHandler : DelegatingHandler {/// <summary>/// 重写发送HTTP请求到内部处理程序的方法/// </summary>/// <param name="request">请求信息</param>/// <param name="cancellationToken">取消操作的标记</param>/// <returns></returns>protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken){// 记录请求内容if (request.Content != null){LogWriter.ToInfo(string.Format("请求Content:{0}", request.Content.ReadAsStringAsync().Result));}// 发送HTTP请求到内部处理程序,在异步处理完成后记录响应内容return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((task) =>{// 记录响应内容LogWriter.ToInfo(string.Format("响应Content:{0}", task.Result.Content.ReadAsStringAsync().Result));return task.Result;});} }
为了使消息处理进入我们自定义的消息处理程序,需要在Global.asax文件的Application_Start方法中,将CustomMessageHandler添加到MessageHandlers中:
protected static void Configure(HttpConfiguration config) {config.MessageHandlers.Add(new CustomMessageHandler()); }protected void Application_Start(object sender, EventArgs e) {Configure(GlobalConfiguration.Configuration); }
DelegatingHandler使用委托模式,这样添加以后,程序就会执行CustomMessageHandler中重写的方法了。
这样也算AOP了一下吧。
关于日志记录,推荐使用log4net或NLog,成熟稳定。
喜欢的朋友赶紧试试吧。
ASP.NET Web API 记录请求响应数据到日志的一个方法相关推荐
- ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序
目录 介绍 设置和运行示例应用程序 类库项目 依赖注入 访问应用程序设置 实体框架核心相关更改 主键标识插入问题 数据上下文和连接字符串 自定义存储库(Repositories) LINQ表达式翻新( ...
- ASP NET Web API 2框架揭秘
ASP.NET Web API2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著 ISBN 978-7-121-23536-8 2014年7月出版 定价:108.00 ...
- ASP.NET Web API 基本操作(CRUD)
上一篇介绍了ASP.NET Web API的基本知识和原理,这一篇我们通过一个更直观的实例,对产品进行CRUD操作(Create/Read/Update/Delete)来继续了解一下它的基本应用. 创 ...
- java调用asp.net webapi_通过HttpClient 调用ASP.NET Web API示例
在前面两篇文章中我们介绍了ASP.NET Web API的基本知识和原理,并且通过简单的实例了解了它的基本(CRUD)操作.我们是通过JQuery和Ajax对Web API进行数据操作.这一篇我们来介 ...
- 监控系统简介(二):使用 App Metrics 在 ASP.NET Web API 中记录指标
回顾 在<监控系统简介:使用 Prometheus 与 Grafana>一文中,我们了解了什么是监控系统,Prometheus 这一监控工具及它提供的数据类型.PromQL 以及 Graf ...
- 【ASP.NET Web API教程】5.2 发送HTML表单数据:URL编码的表单数据
注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本系列教程,请先看前面的内容. 5.2 Sending HTML Form Data 5.2 发送HTML表单数据 本文引 ...
- 利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理
在Asp.net Web API中,对业务数据的分页查询处理是一个非常常见的接口,我们需要在查询条件对象中,定义好相应业务的查询参数,排序信息,请求记录数和每页大小信息等内容,根据这些查询信息,我们在 ...
- ASP.NET MVC和ASP.NET Web API跨域请求问题解决方案【最全】
无论是ASP.NET MVC和ASP.NET Web API跨域请求大致分成2种方式 第一种:web.config 配置 第二种:用HttpContext.Response.AppendHeader设 ...
- ASP.NET Web API 异常日志记录
如果在 ASP.NET MVC 应用程序中记录异常信息,我们只需要在 Global.asax 的 Application_Error 中添加代码就可以了,比如: public class MvcApp ...
最新文章
- 这应该是你见过的最全前端下载总结
- windows2003 服务器安全配置的建议
- 泛架构之于外包IT工程
- 【研发管理】中国企业 VS 世界优秀企业在产品研发上差距(下)
- python调用kafka拉取数据失败_无法使用kafkapython从另一个容器向Kafka容器发出请求...
- 牛客题霸 [ 最长回文子串] C++题解/答案
- Kali渗透测试——WOL-E
- 深度学习2.0-神经网络
- JS 获取WEB请求路径
- python 给字符串加颜色
- 陈桥五笔,我再也不会下载了
- QEMU新的-nic选项
- linux上的两种可执行程序
- 四道Java基础题 你能对几道?
- Cannot get a text value from a numeric cell
- 用pe修改计算机ip地址,实现WinPE上网功能修改IP及DNS方法
- 关于DoEvents
- Linux从图形界面切换到文本界面快捷键不好用的解决方法
- 在java中如何输入_java如何输入
- HTTP学习笔记(适合初学)2
热门文章
- oracle 双引号替换,oracle - Oracle SQL-Loader在值中有效地处理内部双引号 - SO中文参考 - www.soinside.com...
- 读取当前linux进程内存_(笔记)Linux上的内存分配
- python流行趋势_Python流行度再创新高,学Python就从风变编程开始
- MKL学习——向量操作
- React-router总结
- 第96:SVM简介与简单应用
- 一个不错的MYSQL数据库备份类,PHP版,一个文件,精简版
- iOS WebView 加载本地资源(图片,文件等)
- Android 4.2 通知通过PendingIntent启动Activity失败的问题
- Retina时代的前端视觉优化