1.2Web API 2中的Action返回值
本主题描述 ASP.NET Web API 将返回值转换从一个控制器动作到 HTTP 响应消息。
一个 Web API 控制器动作可以返回下列任一操作 ︰
1.void
2.IHttpActionResult
3.HttpResponseMessage
4.一些其他类型
根据每种返回,Web API 使用一个不同的机制来创建 HTTP 响应。
| 返回类型 | Web API 如何创建响应 | 
| void | 返回空 204 (无内容) | 
| HttpResponseMessage | 直接将 HTTP 响应消息转换。 | 
| IHttpActionResult | 调用ExecuteAsync来创建HttpResponseMessage,然后转换到 HTTP 响应消息。 | 
| 其他类型 | 序列化返回值写入响应正文;返回 200 (OK)。 | 
一、Void
如果返回类型为void,Web API 只是返回空的 HTTP 响应状态代码 204 (没有内容)。
示例控制器 ︰
public class ValuesController : ApiController
{
public void Post()
{
}
}
响应报文:
TTP/1.1 No Content
Server: Microsoft-IIS/8.0
Date: Mon, Jan :: GMT
二、HttpResponseMessage
如果该操作返回HttpResponseMessage,Web API 的返回值直接将转换为 HTTP 响应消息,使用HttpResponseMessage对象的属性来填充响应。
此选项使您大量的响应消息的控制权。例如,以下的控制器操作设置缓存控制标头。
public class ValuesController : ApiController
{
public HttpResponseMessage Get()
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, "value");
response.Content = new StringContent("hello", Encoding.Unicode);
response.Headers.CacheControl = new CacheControlHeaderValue()
{
MaxAge = TimeSpan.FromMinutes()
};
return response;
}
}
响应报文:
HTTP/1.1 OK
Cache-Control: max-age=
Content-Length:
Content-Type: text/plain; charset=utf-
Server: Microsoft-IIS/8.0
Date: Mon, Jan :: GMT
hello
如果你将一个域模型传递给CreateResponse方法,Web API 使用媒体格式化程序来序列化的模型写入响应正文。
public HttpResponseMessage Get()
{
// Get a list of products from a database.
IEnumerable<Product> products = GetProductsFromDB(); // Write the list to the response body.
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.OK, products);
return response;
}
Web API 使用 Accept 标头在请求中选择格式化程序。
三、IHttpActionResult
IHttpActionResult接口是WebApi2才采用的。本质上,它定义了HttpResponseMessage工厂。下面是使用IHttpActionResult接口的一些优点 ︰
- 简化了单元测试您的控制器。
 - 移动普通逻辑到单独的类创建 HTTP 响应。
 - 使控制器动作更清晰,意图通过隐藏构建响应的低层细节。
 
IHttpActionResult包含一个单一的方法, ExecuteAsync,其中以异步方式创建一个HttpResponseMessage实例。
public interface IHttpActionResult
{
Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}
如果一个控制器动作返回IHttpActionResult,Web API 调用ExecuteAsync方法来创建HttpResponseMessage。然后它将HttpResponseMessage转换成 HTTP 响应消息。
这里是IHttpActionResult ,创建纯文本响应简单实施 ︰
public class TextResult : IHttpActionResult
{
string _value;
HttpRequestMessage _request; public TextResult(string value, HttpRequestMessage request)
{
_value = value;
_request = request;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
var response = new HttpResponseMessage()
{
Content = new StringContent(_value),
RequestMessage = _request
};
return Task.FromResult(response);
}
}
示例控制器中的操作 ︰
public class ValuesController : ApiController
{
public IHttpActionResult Get()
{
return new TextResult("hello", Request);
}
}
响应报文:
HTTP/1.1 OK
Content-Length:
Content-Type: text/plain; charset=utf-
Server: Microsoft-IIS/8.0
Date: Mon, Jan :: GMT hello
更多时候,您将使用System.Web.Http.Results命名空间中定义的IHttpActionResult实现。ApiContoller类定义返回这些内置操作结果的帮助器方法。
在以下示例中,如果请求不匹配现有的产品 ID,控制器调用ApiController.NotFound来创建 404 (未找到) 响应。否则,控制器调用ApiController.OK,这将创建包含产品 200 (OK) 响应。
public IHttpActionResult Get (int id)
{
Product product = _repository.Get (id);
if (product == null)
{
return NotFound(); // Returns a NotFoundResult
}
return Ok(product); // Returns an OkNegotiatedContentResult
}
四、其他返回类型
对于所有其他返回类型,Web API 使用一个media formatter来序列化返回值。Web API 将序列化的值写入到响应正文。响应状态代码是 200 (OK)。
public class ProductsController : ApiController
{
public IEnumerable<Product> Get()
{
return GetAllProductsFromDB();
}
}
这种方法的一个缺点是你不能直接返回错误代码,例如 404。然而,你可以抛出错误代码为HttpResponseException 。有关详细信息,请参见异常处理在 ASP.NET Web API.
Web API 使用 Accept 标头在请求中选择格式化程序。
请求报文:
GET http://localhost/api/products HTTP/1.1
User-Agent: Fiddler
Host: localhost:
Accept: application/json
响应报文:
HTTP/1.1 OK
Content-Type: application/json; charset=utf-
Server: Microsoft-IIS/8.0
Date: Mon, Jan :: GMT
Content-Length: [{"Id":,"Name":"Yo-yo","Category":"Toys","Price":6.95}]
1.2Web API 2中的Action返回值的更多相关文章
- Controller 中Action 返回值类型  及其 页面跳转的用法
		
•Controller 中Action 返回值类型 View – 返回 ViewResult,相当于返回一个View 页面. -------------------------------- ...
 - JsonResult作为Action返回值时的错误
		
JsonResult作为Action返回值时的错误 System.InvalidOperationException: This request has been blocked because ...
 - loadrunner脚本中参数化和返回值输出log到外部文件
		
loadrunner脚本中参数化和返回值输出log到外部文件 很多时候,我们在做性能测试之前,需要造数据,但是使用的这些参数化数据和生成的返回数据在后面的测试都会用的,所以我们需要在造数据过程中,将参 ...
 - javascript中的函数返回值(return)
		
有些情况,我们希望获取到函数的执行结果,也就是我们需要在函数以外的地方处理执行结果,而不是在函数内部处理.这时我们就需要为函数设一个返回值,也就是return,即函数执行完毕以后返回的结果. 若在函数 ...
 - MyBatis中Mapper的返回值类型
		
insert.update.delete语句的返回值类型 对数据库执行修改操作时,数据库会返回受影响的行数. 在MyBatis(使用版本3.4.6,早期版本不支持)中insert.update.del ...
 - C++中函数的返回值
		
原文 [ 函数的返回值用于初始化在调用函数处创建的临时对象.在求解表达式时,如果需要一个地方储存其运算结果,编译器会创建一个没有命名的对象,这就是 临时对象.temporary object ] -- ...
 - ResultMap和ResultType在使用中的区别、MyBatis中Mapper的返回值类型
		
在使用mybatis进行数据库连接操作时对于SQL语句返回结果的处理通常有两种方式,一种就是resultType另一种就是resultMap,下面说下我对这两者的认识和理解 resultType:当使 ...
 - jQuery中ajax如何返回值到上层函数
		
jQuery中ajax如何返回值到上层函数 一.总结 一句话总结: ajax的同步操作即可,设置 async: false, 二.jquery的同步操作 var can_submit=true; $. ...
 - Web API 2中的Action Results
		
[译]Action Results in Web API 2 单击此处查看原文 本文阐述了ASP.NET Web API是如何将controller action的返回值转换为HTTP respons ...
 
随机推荐
- NOIP2001 一元三次方程求解[导数+牛顿迭代法]
			
题目描述 有形如:ax3+bx2+cx+d=0 这样的一个一元三次方程.给出该方程中各项的系数(a,b,c,d 均为实数),并约定该方程存在三个不同实根(根的范围在-100至100之间),且根与根之差 ...
 - NOIP模拟赛20161016R1
			
1.传教士(bishop) 问题描述: panzhili王国的疆土恰好是一个矩形,为了管理方便,国王jjs将整个疆土划分成N*M块大小相同的区域.由于jjs希望他的子民也能信教爱教(”打拳”神教),所 ...
 - 网盘的选择,百度网盘、google drive 还是 Dropbox
			
我是国内用户,需要越过Chinawall 我使用的是一枝红杏,用着还行 如果要买,结账时输入'laod80' 一枝红杏官网:官网地址 Dropbox: 稳定,速度快 Dropbox官网:链接 操作十分 ...
 - GNU make使用变量⑤变量的引用、定义等
			
在 Makefile 中,变量是一个名字(像是 C 语言中的宏),代表一个文本字符串(变量的值).在 Makefile 的目标.依赖.命令中引用变量的地方,变量会被它的值所取代(与 C 语言中宏引用的 ...
 - 嵌入式Linux驱动学习之路(十一)按键驱动-中断机制
			
轮询方式: 和led驱动不同的是在配置IO引脚的时候,把LED的输出引脚换成输入,在read函数中向外发送io的状态.必须由应用程序不断的来查询当前IO口的状态来判断. 中断方式: /* file n ...
 - Python-09-paramiko模块
			
开发堡垒机之前,先来学习一下Python的paramiko模块,该模块基于SSH用于连接远程服务器并执行相关操作. SSHClient 用于连接远程服务器并执行基本命令 基于用户名密码连接 impor ...
 - kuangbin专题总结一 简单搜索
			
A - 棋盘问题:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别.要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有 ...
 - .pop ----remove 删除
			
s = {1,2,3,4,5,6,'sn','7'} s.pop()#删除随机值 print(s)#{2, 3, 4, 5, 6, '7', 'sn'} s.remove('sn')#删除值 prin ...
 - React2
			
1.属性 a. 属性和状态是react中数据传递的载体: b. 属性是声明以后不允许被修改的东西: c. 属性只能在组件初始化的时候声明并传入组件内部,并且在组件内部通过this.props获取: d ...
 - 怎么样修改小猪cms(从功能库添加)模块关键字
			
需求:修改或者添加从功能库添加中的关键字 这里以添加咨询投诉为列: 找到wwwroot\PigCms\Lib\Action\User目录下的LinkAction.class.php文件(手动找不到直接 ...