波斯马BOSSMA Information Technology

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

发布时间:2012年6月12日 / 分类:ASP.NET, ASP.NET MVC / 214,152 次浏览 / 评论

REST风格的服务架构已经成为越来越多人的选择,之前我用过WCF来实现REST服务,WCF是一个很强大的框架,干这点小事有点太沉重的感觉。后来微软又推出了一个ASP.NET Web API,专门用来处理一些基本的Http服务,即灵活又简单,推荐大家都看看。

今天这篇文章是使用ASP.NET Web API过程中的一个小经验,与大家分享。

后台服务通常需要记录一些运行记录,如输入输出、请求信息、处理过程、响应信息等,在以前记录请求数据和响应数据时,我经常在具体的接口方法中处理,如:

/// <summary>
/// 账户验证
/// </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,成熟稳定。

喜欢的朋友赶紧试试吧。

本博客所有文章如无特别注明均为原创。
复制或转载请以超链接形式注明转自波斯马,原文地址《ASP.NET Web API 记录请求响应数据到日志的一个方法

关键字:

建议订阅本站,及时阅读最新文章!
【上一篇】 【下一篇】

目前有1 条评论

  1. dongdong 0楼:

    hao!

发表评论