ASP.NET WebAPI 03 返回结果
在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)
ASP.NET WebAPI 03 返回结果的更多相关文章
- ASP.Net WebAPI的返回值
Asp.Net WebAPI服务函数的返回值主要可以分为void.普通对象.HttpResponseMessag.IHttpActionResult e四种,本文这里简单的介绍一下它们的区别. 一.返 ...
- Asp.Net WebApi接口返回值IHttpActionResult
WebApi是微软在VS2012 MVC4版本中绑定发行的,webapi2.0同mvc5发行的 webapi一共有以下接口返回值 1.void无返回值2.IHttpActionResult Json( ...
- 使用ASP.Net WebAPI构建REST服务(三)——返回值
Asp.Net WebAPI服务函数的返回值主要可以分为void.普通对象.HttpResponseMessag.IHttpActionResult e四种,本文这里简单的介绍一下它们的区别. 一.返 ...
- Asp.Net WebAPI配置接口返回数据类型为Json格式
Asp.Net WebAPI配置接口返回数据类型为Json格式 一.默认情况下WebApi 对于没有指定请求数据类型类型的请求,返回数据类型为Xml格式 例如:从浏览器直接输入地址,或者默认的XM ...
- ASP.NET Core 2.2 基础知识(十四) WebAPI Action返回类型(未完待续)
要啥自行车,直接看手表 //返回基元类型 public string Get() { return "hello world"; } //返回复杂类型 public Person ...
- ASP.NET WEBAPI 简单CURD综合测试(asp.net MVC,json.net,sql基础存储过程和视图,sqlhelper,json解析)
草图 真正的后端是不管前端是什么平台,用什么语言的,JSON格式的数据应该可以应对.用ASP.NET WEBAPI尝试做一个后端,实现最基本的CURD,业务逻辑和数据库操作都放在后端,前端只需要正 ...
- Asp.Net WebApi核心对象解析(下篇)
在接着写Asp.Net WebApi核心对象解析(下篇)之前,还是一如既往的扯扯淡,元旦刚过,整个人还是处于晕的状态,一大早就来处理系统BUG,简直是坑爹(好在没让我元旦赶过来该BUG),队友挖的坑, ...
- ASP.NET WebApi OWIN 实现 OAuth 2.0
OAuth(开放授权)是一个开放标准,允许用户让第三方应用访问该用户在某一网站上存储的私密的资源(如照片,视频,联系人列表),而无需将用户名和密码提供给第三方应用. OAuth 允许用户提供一个令牌, ...
- Asp.Net WebApi核心对象解析(上篇)
生活需要自己慢慢去体验和思考,对于知识也是如此.匆匆忙忙的生活,让人不知道自己一天到晚都在干些什么,似乎每天都在忙,但又好似不知道自己到底在忙些什么.不过也无所谓,只要我们知道最后想要什么就行.不管怎 ...
随机推荐
- C语言 文件操作8--fputs()和fgets()
//fputs()和fgets() #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> # ...
- Difference Between TIF and TIFF
TIF vs TIFF Many people are confused with similar file extensions that only differ by a single lette ...
- js实现倒计时 类似团购网站
一.demo与效果展示 为节约时间,我就直接套用了企鹅团的界面作为demo的背景.因为是倒计时,所以需要一个固定的时间,为了n年后,某位仁兄打开demo页面依然在倒计时,所以我把倒计时时间设成了205 ...
- 存储过程中执行动态Sql语句
MSSQL为我们提供了两种动态执行SQL语句的命令,分别是EXEC和sp_executesql;通常,sp_executesql则更具有优势,它提供了输入输出接口,而EXEC没有.还有一个最大的好处就 ...
- LeetCode:Single Number II
题目地址:here 题目大意:一个整数数组中,只有一个数出现一次,其余数都出现3次,在O(n)时间,O(1)空间内找到这个出现一次的数 对于”只有一个数出现一次,其余数出现2次“的情况,很简单,只要把 ...
- 去除a标签单击后的虚线框
设置a标签属性outline即可 如: a { outline: none; } a:focus { outline: none; } 在firefox测试通过,webkit内核浏览器无此问题
- Object C学习笔记17-动态判断和选择器
当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关 ...
- DOM系列---DOM操作样式
发文不易,若转载传播,请亲注明出处,谢谢! 一.操作样式 CSS作为(X)HTML的辅助,可以增强页面的显示效果.但不是每个浏览器都能支持最新的CSS能力.CSS的能力和DOM级别密切相关,所以我们有 ...
- AngularJS开发指南2:AngularJS初始化过程
自动初始化 请将ng-app指令放到你应用的标签节点中, 如果你想要AngularJS自动执行整个<html>程序就把它放在 <html> 标签中.比如:<html ng ...
- 微信内置浏览器的JsAPI(WeixinJSBridge续)[转载]
原文地址: http://www.baidufe.com/item/f07a3be0b23b4c9606bb.html 之前有写过几篇关于微信内置浏览器(WebView)中特有的Javascript ...