1.定义统一的返回类
public class ApiResultModel
{
private HttpStatusCode statusCode;
private object data;
private string errorMessage;
private bool isSuccess;
public HttpStatusCode StatusCode
{
get { return statusCode; }
set { statusCode = value; }
}
public object Data
{
get { return data; }
set { data = value; }
}
public string ErrorMessage
{
get { return errorMessage; }
set { errorMessage = value; }
}
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
{
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();
if (actionExecutedContext.Exception != null)
{
throw actionExecutedContext.Exception;
}
else
{
result.StatusCode = actionExecutedContext.ActionContext.Response.StatusCode;
var a = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>();
if (!a.IsFaulted)
{
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.封装全局异常处理
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(() =>
{
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());