在一个后端接口系统中,发布的接口,数据交互应该有一套统一的标准,以便调用方有一个高效、统一的处理。
而每个业务程序开发人员,可能只关心自己相对应的接口业务,而造成数据格式不同和大量的相应的日志记录操作。
所以需要一套统一的日志记录和简单统一的数据结构封装
1、在WebApi项目中添加自定义消息处理委托类:CustomMessageDelegatingHandler
/// <summary> /// API自定义消息处理委托类。 /// 对消息进行自定义操作、日志记录。 /// </summary> public class CustomMessageDelegatingHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { //请求参数记录 string guid = Guid.NewGuid().ToString("N"); LogHelper.WriteLog(guid + "-[" + request.Method.Method + "]:" + request.RequestUri); return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) => { HttpResponseMessage response = responseToCompleteTask.Result; HttpError error = null; if (response.TryGetContentValue<HttpError>(out error)) { //添加自定义错误处理 //error.Message = "Your Customized Error Message"; } if (error != null) { //封装处理异常信息,返回指定JSON对象 WebAPIResultEntity webAPIResult = new WebAPIResultEntity() { status_code = "-999", message = error.Message + error.ExceptionMessage }; //response.Content = new StringContent(ConversionHelper.ObjectToJson(webAPIResult), System.Text.Encoding.UTF8, "application/json"); } else { //可以将反馈的数据读取出来重新封装按照指定格式统一返回 var str = response.Content.ReadAsStringAsync().Result; //数据封装... //response.Content = new StringContent(str, System.Text.Encoding.UTF8, "application/json"); } //反馈参数记录 LogHelper.WriteLog(guid + "-" + response.Content.ReadAsStringAsync().Result); return response; }); } }
2、在WebApiConfig中添加注册消息类
//自定义消息类型
config.MessageHandlers.Add(new CustomMessageDelegatingHandler());
这样调用接口时,就可以统一记录请求参数和反馈数据、也能统一封装自己想要的数据包装格式
如:
{
"data":{
"result":"123"
},
"message":"成功",
"code":"200"
}
或
{
"data":null,
"message":"未将对象引用到实例",
"code":"-999"
}
代码中的LogHelper是自己封装的log4net日志记录框架,网上有很多集成教程