这是msdn原文文档!明天用,留存。

Web API 控制器操作可以返回以下任何内容:

  1. void
  2. HttpResponseMessage
  3. IHttpActionResult
  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()
{
}
}

Http相应:

HTTP/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

IHttpActionResult

Web API 2 中引入了IHttpActionResult接口。 实质上,它定义了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

更频繁地使用在 IHttpActionResult 命名空间中定义的 实现。 ApiController类定义返回这些内置操作结果的帮助器方法。

在以下示例中,如果请求与现有产品 ID 不匹配,则控制器将调用ApiController来创建404(未找到)响应。 否则,控制器将调用ApiController,这将创建一个包含该产品的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 使用媒体格式化程序来序列化返回值。 Web API 将序列化的值写入响应正文。 响应状态代码为200(正常)。

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}]

临时保存,这是msdn的文档原文!

Web API 2 的操作结果的更多相关文章

  1. Web API与文件操作

    前段时间,一直有练习ASP.NET MVC与Web API交互,接下来,Insus.NET再做一些相关的练习,Web API与文件操作,如POST文件至Web API,更新或是删除等. 不管怎样,先在 ...

  2. Asp.Net Web API 2(CRUD操作)第二课

    Asp.Net Web API 2(CRUD操作)第二课 Asp.Net Web API 导航   Asp.Net Web API第一课:入门http://www.cnblogs.com/aehyok ...

  3. ASP.NET Core Web API Cassandra CRUD 操作

    在本文中,我们将创建一个简单的 Web API 来实现对一个 “todo” 列表的 CRUD 操作,使用 Apache Cassandra 来存储数据,在这里不会创建 UI ,Web API 的测试将 ...

  4. 不使用jQuery对Web API接口POST,PUT,DELETE数据

    前些天,Insus.NET有演示Web API接口的操作: <怎样操作WebAPI接口(显示数据)>http://www.cnblogs.com/insus/p/5670401.html ...

  5. 2.3属性在 ASP.NET Web API 2 路由

    路由是 Web API 如何匹配 URI 的行动.Web API 2 支持一种新型的路由,称为属性路由.顾名思义,属性路由使用属性来定义路由.属性路由给你更多的控制 Uri 在您的 web API.例 ...

  6. ASP.NET Web API - ASP.NET MVC 4 系列

           Web API 项目是 Windows 通信接口(Windows Communication Foundation,WCF)团队及其用户激情下的产物,他们想与 HTTP 深度整合.WCF ...

  7. 返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API

    原文:返璞归真 asp.net mvc (10) - asp.net mvc 4.0 新特性之 Web API [索引页][源码下载] 返璞归真 asp.net mvc (10) - asp.net ...

  8. 通过HttpClient 调用ASP.NET Web API

    在前面两篇文章中我们介绍了ASP.NET Web API的基本知识和原理,并且通过简单的实例了解了它的基本(CRUD)操作.我们是通过JQuery和Ajax对Web API进行数据操作.这一篇我们来介 ...

  9. ASP.NET Web API编程——序列化与内容协商

    1 多媒体格式化器 多媒体类型又叫MIME类型,指示了数据的格式.在HTTP协议中多媒体类型描述了消息体的格式.一个多媒体类型包括两个字符串:类型和子类型. 例如: text/html.image/p ...

随机推荐

  1. ElasticSearch最全分词器比较及使用方法

    介绍:ElasticSearch 是一个基于 Lucene 的搜索服务器.它提供了一个分布式多用户能力的全文搜索引擎,基于 RESTful web 接口.Elasticsearch 是用 Java 开 ...

  2. 【IDE_IntelliJ IDEA】IDEA中使用Junit插件自动创建测试用例到test目录

    第一步 从插件资源库中搜索JunitGenerator V2.0插件并安装 第二步 配置测试用例的生成目录 1.打开File->Settings 2.搜索junit,找到JUnit Genera ...

  3. 华为云fusionsphere 6.1组件功能

      [fsp@controller-21 ~]$ openstack --version ##fusionsphere 6.1基于openstack 2.2.1 [fsp@controller-21 ...

  4. c# 第17节 二维数组声明、使用

    本节内容: 1:为什么要有二维数组 2:二维数据 3:实例二维数组声明 4:二维数组的使用 1:为什么要有二维数组 2:二维数据声明 3:实例二维数组声明 4:二维数组的使用 foreach遍历 5: ...

  5. python处理JSON 序列化与反序列化

    #序列化 >>> import json>>> d={"key":"value"}>>> d{'key': ...

  6. Android TextField : set focus + soft input programmatically

    Good sir, try this: edittext.setFocusableInTouchMode(true); edittext.requestFocus(); Im not sure, bu ...

  7. maven settings

    maven settings 私有服settigs <?xml version="1.0" encoding="UTF-8"?> <setti ...

  8. SLAM:暑期学校

    专门开个(大)坑: RGB-D SLAM:姜翰青,商汤 视觉SLAM:章国锋,浙大CAD&CG国家重点实验室

  9. leetcode206. 反转链表

    1:迭代法 假设存在链表 1 → 2 → 3 → Ø,我们想要把它改成 Ø ← 1 ← 2 ← 3. 在遍历列表时,将当前节点的 next 指针改为指向前一个元素.由于节点没有引用其上一个节点,因此必 ...

  10. javascript中的e是什么意思?

    e 代表事件(event)对象,即所谓的事件驱动源,包含了许多属性和方法.下面以鼠标点击事件为例,作一个测试: (HTML) <!DOCTYPE html> <html> &l ...