Asp.net webApi统一封装返回结果+全局异常处理
1.定义统一的返回类
/// <summary>
/// 返回类型
/// </summary>
public class ApiResultModel
{
private HttpStatusCode statusCode;
private object data;
private string errorMessage;
private bool isSuccess;
/// <summary>
/// 状态代码
/// </summary>
public HttpStatusCode StatusCode
{
get { return statusCode; }
set { statusCode = value; }
}
/// <summary>
/// 返回的数据
/// </summary>
public object Data
{
get { return data; }
set { data = value; }
}
/// <summary>
/// 错误消息
/// </summary>
public string ErrorMessage
{
get { return errorMessage; }
set { errorMessage = value; }
}
/// <summary>
/// 是否成功
/// </summary>
public bool IsSuccess
{
get { return isSuccess; }
set { isSuccess = value; }
}
}
2.定义不需要被封装的特性
public class NoPackageResult : Attribute
{
}
3.定义Json结果处理类
public class JsonHelper
{
public static HttpResponseMessage toJson(Object obj)
{
String str;
if (obj is String || obj is Char)//如果是字符串或字符直接返回
{
str = obj.ToString();
}
else//否则序列为json字串
{
JavaScriptSerializer serializer = new JavaScriptSerializer();
str = serializer.Serialize(obj);
}
HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
return result;
}
}
4.定义统一格式过滤器
public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
// 不包裹返回值
var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
if (!noPackage.Any())
{
ApiResultModel result = new ApiResultModel();
//先捕获API内部的异常,无论代码能否完整执行,客户端都能得到正确的响应格式
if (actionExecutedContext.Exception != null)
{
throw actionExecutedContext.Exception;
//result.StatusCode = System.Net.HttpStatusCode.InternalServerError;
//result.IsSuccess = false;
//result.ErrorMessage = actionExecutedContext.Exception.Message;
}
else
{
// 取得由 API 返回的状态代码
result.StatusCode = actionExecutedContext.ActionContext.Response.StatusCode;
var a = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>();
if (!a.IsFaulted)
{
// 取得由 API 返回的资料
result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
}
//请求是否成功
result.IsSuccess = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;
}
//结果转为自定义消息格式
HttpResponseMessage httpResponseMessage = JsonHelper.toJson(result);
// 重新封装回传格式
actionExecutedContext.Response = httpResponseMessage;
}
}
}
5.在WebApiConfig下注册的结果过滤器
config.Filters.Add(new ApiResultAttribute());//重新包装结果
6.封装全局异常处理
/// <summary>
/// 全局异常过滤器
/// </summary>
/// <!-- 2019-8-22 16:18:10 添加 -->
public class ExceptionFilter : System.Web.Http.Filters.IExceptionFilter
{
public bool AllowMultiple => true;
public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
{
var ex = actionExecutedContext.Exception.InnerException ?? actionExecutedContext.Exception;
return Task.Run(() =>
{
//异常记录日志到本地 2019-8-28 13:55:45 添加
//Common.LogHelpter.AddLog(ex.ToString());
string msg = ex.Message;
ApiResultModel result = new ApiResultModel();
result.IsSuccess = false;
result.StatusCode = System.Net.HttpStatusCode.OK;
result.ErrorMessage = msg;
//结果转为自定义消息格式
HttpResponseMessage httpResponseMessage = JsonHelper.toJson(result);
// 重新封装回传格式
actionExecutedContext.Response = httpResponseMessage;
});
}
}
7.在WebApiConfig下注册的全局异常过滤器
config.Filters.Add(new ExceptionFilter());//重新包装异常处理过滤器
参考文章:
https://www.cnblogs.com/wuyubing/p/5307940.html