如果不想寫代碼直接使用nuget安裝筆者已經封裝好的就可以馬上實作(nuget搜尋ZetaWebApi)選擇>=1.0.1版本-----不懂使用nuget的請檢視筆者的nuget系列文章

如果習慣自己寫代碼請繼續往下看
先建立要傳回的結果類型:
/// <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; }
}
}
然後建立重寫ActionFilterAttribute下的OnActionExecuted(執行action之後):
先建一個類名字随意如:ApiResultAttribute繼承于System.Web.Http.Filters.ActionFilterAttribute詳細代碼如下:
以下代碼需注意要引用using System.Net.Http否則ReadAsAsync不能使用
public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
ApiResultModel result = new ApiResultModel();
// 取得由 API 傳回的狀态代碼
result.StatusCode = actionExecutedContext.ActionContext.Response.StatusCode;
// 取得由 API 傳回的資料
result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
//請求是否成功
result.IsSuccess = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;
//結果轉為自定義消息格式
HttpResponseMessage httpResponseMessage = JsonHelper.toJson(result);
// 重新封裝回傳格式
actionExecutedContext.Response = httpResponseMessage;
}
}
上面的JsonHelper.toJson()是事先寫好的代碼如下:建立類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;
}
建完之後在WebApiConfig下注冊:
config.Filters.Add(new ApiResultAttribute());//重新包裝結果
完成以上步驟即可使用。
補充:
特殊情況不需要封裝傳回結果,解決方法:
1建立一個自定義屬性
假設自定義類名為NoPackageResult繼承Attribute
public class NoPackageResult : Attribute
{
}
2,修改上面的ApiResultAttribute類裡的OnActionExecuted方法
在方法裡加一個判斷是否有屬性有的情況下就不做封裝的步驟
var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
if (!noPackage.Any())
{
//執行封裝
}
3在不需要封裝的接口上添加屬性NoPackageResult如下:
ApiResultAttribute類完整代碼:
public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
{
base.OnActionExecuted(actionExecutedContext);
// 不包裹傳回值
var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
if (!noPackage.Any())
{
//初始化傳回結果
ApiResultModel result = new ApiResultModel();
if (actionExecutedContext.Exception != null)
{
result.Code = "sys_error";
result.Success = false;
result.Message = actionExecutedContext.Exception.Message;
}
else
{
// 取得由 API 傳回的狀态代碼
result.Code = actionExecutedContext.ActionContext.Response.StatusCode.ToString();
var a = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>();
if (!a.IsFaulted)
{
// 取得由 API 傳回的資料
result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
}
//請求是否成功
result.Success = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;
}
//結果轉為自定義消息格式
HttpResponseMessage httpResponseMessage = CustomerHttpResponseMessage.toJson(result);
// 重新封裝回傳格式
actionExecutedContext.Response = httpResponseMessage;
}
}
}
View Code
有夢想一定要去做
但是未必一定要實作