在WebAPI中HttResponseMessage作為消息返回,而在ApiController中我們經常講四類數據作為返回值,void,object(可序列化),IHttpActionResult,HttpResponseMessage,
Void與object
Void:返回狀態碼200,無數據
Object: 返回狀態碼200,數據
IHttpActionResult
public interface IHttpActionResult { Task<System.Net.Http.HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken); } }
WebAPI為我們定義了一IHttpActionResult接口,從命名我們就可以來它是作為Action執行的返回結果。
在WebAPI總已經定義了很多實現了IHttpActionResult的類:
這些類大致可以分為:只有狀態碼,重定向,實體序列化,錯誤信息,201Created等幾類。
狀態碼
CodeStatusResult:指定狀態碼
BadRequestResult:400
OkResult:200
NotFoundResult:404
UnAuthorizedResult:401
ConflictResult:409
InternalServerErrorResult:500
重定向
狀態碼302,並返回重定向url
RedirectResult:按絕對路徑
RedirectToRouteResult:按路由
WebApi為我們提供了一個UrlHelp類,可實現路由向絕對路徑的轉換
IDictionary<string, object> route = new Dictionary<string, object>(); UrlHelper helper = new UrlHelper(Request); route["controller"] = "Figure"; route["action"] = "GetAll"; string AbsoluteUrl = helper.Link("DefaultApi", route);
實體序列化
FormattedContentResult<T>:自定義序列化方式與狀態碼
NegotiatedContentResult<T>:自定義狀態碼,根據請求頭信息匹配序列化類型
OkNegotiatedContentResult<T>:狀態碼200,根據請求頭信息匹配序列化類型
JsonResult<T>:狀態碼200,Json序列化
錯誤信息
ExceptionResult:500, eg: {"Message":"出現錯誤。","ExceptionMessage":"未實現該方法或操作。","ExceptionType":"System.NotImplementedException","StackTrace":null}
BadRequestErrorMessageResult:400,eg: {"Message":"Error"}
InvalidModelStateResult:400,Model綁定錯誤,eg: {"Message":"請求無效。","ModelState":{"argument":["值不在預期的范圍內。"],"implemented":["未實現該方法或操作。"]}}
這三種類型最終都是裝換成HttpError
201 Created
CreatedNegotiatedContentResult<T>與CreatedAtRouteNegotiatedContentResult<T>
返回"201 Created"的狀態。
同時ApiController也為我們定義許多返回IHttpActionResult的方法
public abstract class ApiController
{
protected internal virtual InvalidModelStateResult BadRequest(ModelStateDictionary modelState);
protected internal virtual NegotiatedContentResult<T> Content<T>(HttpStatusCode statusCode, T value);
protected internal FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter);
protected internal virtual FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter, MediaTypeHeaderValue mediaType);
protected internal FormattedContentResult<T> Content<T>(HttpStatusCode statusCode, T value, MediaTypeFormatter formatter, string mediaType);
protected internal CreatedNegotiatedContentResult<T> Created<T>(string location, T content);
protected internal virtual CreatedNegotiatedContentResult<T> Created<T>(Uri location, T content);
protected internal virtual CreatedAtRouteNegotiatedContentResult<T> CreatedAtRoute<T>(string routeName, IDictionary<string, object> routeValues, T content);
protected internal CreatedAtRouteNegotiatedContentResult<T> CreatedAtRoute<T>(string routeName, object routeValues, T content);
protected internal virtual InternalServerErrorResult InternalServerError();
protected internal virtual ExceptionResult InternalServerError(Exception exception);
protected internal JsonResult<T> Json<T>(T content);
protected internal JsonResult<T> Json<T>(T content, JsonSerializerSettings serializerSettings);
protected internal virtual JsonResult<T> Json<T>(T content, JsonSerializerSettings serializerSettings, Encoding encoding);
protected internal virtual NotFoundResult NotFound();
protected internal virtual OkResult Ok();
protected internal virtual OkNegotiatedContentResult<T> Ok<T>(T content);
protected internal virtual RedirectResult Redirect(string location);
protected internal virtual RedirectResult Redirect(Uri location);
protected internal virtual RedirectToRouteResult RedirectToRoute(string routeName, IDictionary<string, object> routeValues);
protected internal RedirectToRouteResult RedirectToRoute(string routeName, object routeValues);
protected internal virtual ResponseMessageResult ResponseMessage(HttpResponseMessage response);
protected internal virtual StatusCodeResult StatusCode(HttpStatusCode status);
protected internal virtual UnauthorizedResult Unauthorized(IEnumerable<AuthenticationHeaderValue> challenges);
protected internal UnauthorizedResult Unauthorized(params AuthenticationHeaderValue[] challenges);
}
HttpResponseMessage
HttpResponseMessage表示包括狀態代碼和數HTTP 響應消息。在整個WebAPI中HttpResponseMessage是作為最終的請求結果,自然HttpResponseMessag可以作為Action的返回結果。如果單從返回數據上看我們可以只關心狀態碼(StatusCode),內容(Content),頭信息(Headers)。
public class HttpResponseMessage : IDisposable { public HttpResponseMessage(); public HttpResponseMessage(HttpStatusCode statusCode); public HttpContent Content { get; set; } public HttpResponseHeaders Headers { get; } public HttpStatusCode StatusCode { get; set; } }
其實WebAPI定義了一個ResponseMessageResult,這個類實現了IHttpActionResult接口,這個類只重載了一個構造函數,定義了一個HttpResponseResult的屬性
public class ResponseMessageResult : IHttpActionResult { public ResponseMessageResult(HttpResponseMessage response); public HttpResponseMessage Response { get; } public virtual Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken); }
其中WebAPI為我們定義很多HttpContent的派生類。
ByteArrayContent
FormUrlEncodedContent
MultipartContent
MultipartFormDataContent
StreamContent
StringContent
不管是Void,object,IHttpActionResult都將生成HttpResponseMessage。
IhttpActionResult接口中只定義了一個ExecuteAsync方法
Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
所以IHttpActionResult可以很容易得到HttpResponseMessage
源碼
Github: https://github.com/BarlowDu/WebAPI (API_3)