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了一下吧。

关于日志记录,推荐使用log4netNLog,成熟稳定。

喜欢的朋友赶紧试试吧。

时间: 2024-09-30 10:56:00

ASP.NET Web API 记录请求响应数据到日志的一个方法的相关文章

ASP.NET Web API实践系列02,在MVC4下的一个实例, 包含EF Code First,依赖注入, Bootstrap等

本篇体验在MVC4下,实现一个对Book信息的管理,包括增删查等,用到了EF Code First, 使用Unity进行依赖注入,前端使用Bootstrap美化.先上最终效果: →创建一个MVC4项目,选择Web API模版. →在Models文件夹创建一个Book.cs类. namespace MyMvcAndWebApi.Models { public class Book { public int Id { get; set; } public string Name { get; set

ASP.NET Web API 控制请求频率

参考地址:http://www.cnblogs.com/shanyou/p/3194802.html 安装nuget包:WebApiContrib 很多的api,例如GitHub’s API 都有流量控制的做法.使用速率限制,以防止在很短的时间量客户端向你的api发出太多的请求.例如,我们可以限制匿名API客户端每小时最多60个请求,而我们可以让更多的经过认证的客户端发出更多的请求.那么asp.net webapi如何实现这样的功能呢?在项目WebApiContrib 上面已经有了一个实现:ht

ASP.NET Web API实践系列07,获取数据, 使用Ninject实现依赖倒置,使用Konockout实现页面元素和视图模型的双向绑定

本篇接着上一篇"ASP.NET Web API实践系列06, 在ASP.NET MVC 4 基础上增加使用ASP.NET WEB API",尝试获取数据. 在Models文件夹下创建Comment类: namespace MvcApplication5.Models { public class Comment { public int ID { get; set; } public string Author { get; set; } public string Text { ge

新作《ASP.NET Web API 2框架揭秘》开始全面接受预订

我觉得大部分人都是"眼球动物",他们关注的往往都是目光所及的东西.对于很多软件从业者来说,他们对看得见(具有UI界面)的应用抱有极大的热忱,但是对背后支撑整个应用的服务却显得较为冷漠.如果我们将整个"生态系统"比喻成海面上漂浮的冰山,我们所能看的到的只是露出水面的冰山一角,水面之下才是一个"庞然大物". 提到服务,我们自然想到Web Service.但是传统意义上的Web Service却有点名不副实,因为支撑它的其实不是Web而是SOAP,承载

ASP.NET Web API路由系统:路由系统的几个核心类型

虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除了对System.Web.dll程序集的依赖,实现在ASP.NET Web API框架中的URL路由系统亦是如此.也就是说,ASP.NET Web API核心框架的URL路由系统与ASP.NET本身的路由系统是相对独立的.但是当我们采用基于Web Host的方式(定义在程序集System.Web.H

ASP.NET Web API 2框架揭秘

ASP.NET Web API 2框架揭秘(.NET领域再现力作顶级专家精讲微软全新轻量级通信平台) 蒋金楠 著   ISBN 978-7-121-23536-8 2014年7月出版 定价:108.00元 732页 16开 编辑推荐 √ 这是一本注重实证的书,功能各异.多达120个可供下载的示例,大量最佳实践与实用性扩展,可直接用于解决实际开发问题. √ 全新的学习方法,通过完整论证来实现彻底的融会贯通. √ 本书可以作为讲设计架构的书来读,因为其以经过长期检验的经典架构作为学习素材,可很好地启

ASP.NET Web API 基本操作(CRUD)

上一篇介绍了ASP.NET Web API的基本知识和原理,这一篇我们通过一个更直观的实例,对产品进行CRUD操作(Create/Read/Update/Delete)来继续了解一下它的基本应用. 创建ASP.NET Web API应用程序  在VS中选择创建一个ASP.NET Web Application应用程序,在向导的下一个窗口中选择Web API模板. 创建Model 这里我们在Models文件夹下创建一个简单的Product model类,用来传递数据. 在Models文件夹上点击右

ASP.NET Web API 路由 (上)

1 什什么是ASP.NET Web API 路由 ASP.NET Web路由其实就是一个抽象的消息处理管道,ASP.NET Web API的路由机制不同于ASP.NET的路由机制,但是与ASP.NET的路由有着相似的一套设计. 2 ASP.NET Web API 请求和响应的相关对象 ASP.NET Web API的请求是通过HtppRequestMessage作为管道来处理请求的消息,通过HtppReponseMessage作为管道来处理响应的消息.也就是ASP.NET Web API处理用户

ASP.NET Web API实践系列05,消息处理管道

ASP.NET Web API的消息处理管道可以理解为请求到达Controller之前.Controller返回响应之后的处理机制.之所以需要了解消息处理管道,是因为我们可以借助它来实现对请求和响应的自定义处理.所有的请求被封装到HttpRequestMessage这个类中,所有的响应被封装到HttpResponseMessage这个类中. 既然消息处理管道是可扩展的,那么,ASP.NET Web API一定为我们准备了便于扩展的接口或抽象类,它就是HttpMessageHandler抽象类.