1. HttpResponseMessage
  2. IHttpActionResult
  3. void
  4. 某些其他类型
  5. 总结归纳

原文地址:https://www.cnblogs.com/xgzh/p/11208611.html

HttpResponseMessage


    HttpResponseMessage是ASP.NET Web API 的标准返回值可以直接将转换为 HTTP 响应消息,那为什么我们不推荐使用HttpResponseMessage,主要是因为用起来比较麻烦,当然HttpResponseMessage提供大量控制的响应消息用来操作设置的缓存控制标头。为什么说HttpResponseMessage是ASP.NET Web API 的标准返回值,最后再讲,先看看如何使用HttpResponseMessage作为返回值。

    public HttpResponseMessage Get()
{
HttpResponseMessage response = Request.CreateResponse(HttpStatusCode.Accepted, "value");
//设置内容和编码
response.Content = new StringContent("Link sucess", Encoding.BigEndianUnicode);
response.Headers.CacheControl = new CacheControlHeaderValue()
{
MaxAge = TimeSpan.FromMinutes(10),//设置缓存 };
return response;
}

    HTTP 响应:

    HTTP/1.1 202 Accepted
Cache-Control: max-age=1200
Content-Length: 22
Content-Type: text/plain; charset=utf-16
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcZ2l0SHViXFdlYkFQSVN0dWR5QXBwbGljYXRpb25cV2ViQVBJU3R1ZHlBcHBsaWNhdGlvblxhcGlcUmV0dXJuVmFsdWU=?=
X-Powered-By: ASP.NET

    HttpResponseMessage作为返回值使用的太少,我除了下载文件外基本没用到过,

    public HttpResponseMessage DownloadFile(string filename)
{ string filePath = HttpContext.Current.Server.MapPath("/") + "Files\\" + filename;
FileStream stream = new FileStream(filePath, FileMode.Open);
HttpResponseMessage response = new HttpResponseMessage(HttpStatusCode.OK);
response.Content = new StreamContent(stream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = HttpUtility.UrlEncode(fileName)
};
response.Headers.Add("Access-Control-Expose-Headers", "FileName");
response.Headers.Add("FileName", HttpUtility.UrlEncode(fileName));
return response;
}

IHttpActionResult


    IHttpActionResult Web API 2 中引入了接口。 从根本上来说,用于将其他类型的值转换为HttpResponseMessage类型值的工厂。果控制器操作返回IHttpActionResult,Web API 调用ExecuteAsync方法创建HttpResponseMessage。 然后它会将转换HttpResponseMessage到 HTTP 响应消息。我个人比较用的多。使用IHttpActionResult:

  • 测试时更加简单方便。
  • 在单独的类创建 HTTP 响应的常见逻辑,响应的内容为HttpResponseMessage。
  • 通过隐藏构造响应的低级细节,使控制器操作的意图更加清晰。

下面是一个和返回值为void一样功能的VoiResult,该类实现了IHttpActionResult仅返回状态代码 204 (无内容) 的空 HTTP 响应。

    /// <summary>
/// 一个无响应内容的响应信息
/// </summary>
public class VoidResult : IHttpActionResult
{ HttpRequestMessage request; public VoidResult(HttpRequestMessage httpRequest)
{
this.request = httpRequest;
}
public VoidResult(ApiController controller)
{
this.request = controller.Request;
} public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.FromResult<HttpResponseMessage>(new HttpResponseMessage(HttpStatusCode.NoContent) { RequestMessage = request });
}
}

    调用代码:

    public IHttpActionResult Get()
{
return new VoidResult(Request);
}

    HTTP 响应:

    HTTP/1.1 204 No Content
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcZ2l0SHViXFdlYkFQSVN0dWR5QXBwbGljYXRpb25cV2ViQVBJU3R1ZHlBcHBsaWNhdGlvblxhcGlcUmV0dXJuVmFsdWU=?=
X-Powered-By: ASP.NET

    该示例说明了通过IHttpActionResult来构造响应的具体细节,使控制器操作的意图更加清晰和复用。

    IHttpActionResult包含一个方法ExecuteAsync,以便以异步方式创建HttpResponseMessage实例。

    public interface IHttpActionResult
{
Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken);
}

    如果控制器操作返回IHttpActionResult,Web API 调用ExecuteAsync方法创建HttpResponseMessage。 然后它会将转换HttpResponseMessage到 HTTP 响应消息。一般情况下我们只需要使用ApiController类内置的方法即可,方法内生成的instance定义在System.Web.Http.Results下。

方法 实例的类名 响应信息 响应内容
OK() OKResult 200 (正常) 无
Ok(T content) OkNegotiatedContentResult 200 (正常 序列化的结果
Json(T content) JsonResult 200 Json序列化的结果
Json(T content, JsonSerializerSettings serializerSettings) JsonResult 200 Json序列化的结果
NotFound() NotFoundResult 404
Redirect(..) RedirectResult 跳转
RedirectToRoute(...) RedirectToRouteResult 跳转
ResponseMessage(HttpResponseMessage response) ResponseMessageResult [别用浪费资源]
StatusCode(HttpStatusCode status) StatusCodeResult 输入的状态码 无
Unauthorized(params AuthenticationHeaderValue[] challenges) UnauthorizedResult 401 未授权的信息明细

void


    如果Web API Action返回类型为void,Web API 仅返回状态代码 204 (无内容) 的空 HTTP 响应。

    [HttpGet]
public void Test()
{
//连接测试
}

    HTTP 响应:

    HTTP/1.1 204 No Content
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
Server: Microsoft-IIS/8.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcLk5FVCBNVkMgIEFDRSBhZG1pblxXZWJcYXBpXEF1dGhvcml6YXRpb24=?=
X-Powered-By: ASP.NET

某些其他类型


    对于所有其他返回类型,Web API 使用媒体格式化程序要序列化的返回值。 Web API 将序列化的值写入到响应正文。 响应状态代码为 200 (正常)。似乎所有类型都可以作为返回值,其实不然。再说这一问题前线看看什么样的实例能作为返回值。

  • 值类型但是其值为null,可空的值不在其范围内例如(int不可以返回null, Nullable 也就是int?是可以返回为null的)
  • 类型不是泛型并且也不是Nullable<>类型的null实例不能做为返回值。
  • 不能被赋值给新实例的实例不能作为返回值

    某些其他类型返回值的控制器最终回传的是什么格式的数据:回执的数据格式决定在于请求的Accept参数的第一个格式(不包括txt,如果是/则返回Json)或者是在Global.asax里的设置或被调用的设置。

    Produce[] produces = new Produce[] {
new Produce{id=1,Name="自动化测试3",Price=11.2},
new Produce{id=2,Name="自动化测试2",Price=12.2 },
new Produce{id=3,Name="自动化测试2",Price=13.2 }
};
[HttpGet]
public Produce[] Test()
{
return produces;
}

    HTTP 响应:

    HTTP/1.1 200 OK
Cache-Control: no-cache
Pragma: no-cache
Content-Type: application/json; charset=utf-8
Expires: -1
Server: Microsoft-IIS/10.0
X-AspNet-Version: 4.0.30319
X-SourceFiles: =?UTF-8?B?RTpcLk5FVCBNVkMgIEFDRSBhZG1pblxXZWJcYXBpXEF1dGhvcml6YXRpb24=?=
X-Powered-By: ASP.NET

    数据内容为:

    [{"id":1,"Name":"自动化测试3","Price":11.2},{"id":2,"Name":"自动化测试2","Price":12.2},{"id":3,"Name":"自动化测试2","Price":13.2}]

    既然那么多的数据类型都可以作为返回值,那么执行Web Api是怎么处理返回值的呢?我们通过查看源码可以直到,最终是由ApiControllerActionInvoker.InvokeActionAsyncCore 来执行Action的。在InvokeActionAsyncCore可中将返回值作为以下几类处理

  • IHttpActionResult:该类型直接调用ExecuteAsync方法来获取一个HttpResponseMessage实例,将该实例返回;
  • HttpResponseMessage:将实例设置RequestMessage后直接返回
  • void: 返回一个新的HttpResponseMessage实例,设置其HttpStatusCode为NoContent
  • 不在上述类型中的类型:返回一个新的HttpResponseMessage实例,设置其HttpStatusCode为NoContent,Content为ObjectContent<T >。

总结归纳


  1. WEB API2 的最终返回值的类型为HttpResponseMessage,其他的返回值类型会经过一系列的处理形成一个HttpResponseMessage实例。
  2. 除了返回JsonResult实例返回的数据格式是Json外,其他的返回格式按请求或者设置而定。

ASP.NET Web API 2 的返回结果的更多相关文章

  1. ASP.NET Web API 中的返回数据格式以及依赖注入

    本篇涉及ASP.NET Web API中的返回数据合适和依赖注入. 获取数据 public IEnumerable<Food> Get() { var results = reop.Get ...

  2. asp.net web api 向客户端返回错误信息

    1使用Http状态码 ASP.NET Web Api框架提供了Http状态码的值,如下图所示. 虽然有这些预定义的状态码,但在实际项目中使用自定状态码结合预定义状态码更有优势. 通过在适当的位置抛出异 ...

  3. ASP.NET WEB API 返回JSON 出现2个双引号问题

    前言          在使用ASP.NET WEB API时,我想在某个方法返回JSON格式的数据,于是首先想到的就是手动构建JSON字符串,如:"{\"result\" ...

  4. 001.開始使用ASP.NET Web API 2(一)

    原文鏈接:http://www.asp.net/web-api/overview/getting-started-with-aspnet-web-api/tutorial-your-first-web ...

  5. 能省则省:在ASP.NET Web API中通过HTTP Headers返回数据

    对于一些返回数据非常简单的 Web API,比如我们今天遇到的“返回指定用户的未读站内短消息数”,返回数据就是一个数字,如果通过 http response body 返回数据,显得有些奢侈.何不直接 ...

  6. ASP.NET Web API中把分页信息放Header中返回给前端

    谈到ASP.NET Web API的分页,考虑的因素包括: 1.上一页和下一页的uri2.总数和总页数3.当前页和页容量 接着是服务端的数据以怎样的形式返回? 我们通常这样写: {    totalC ...

  7. ASP.NET Web API 2:Action的返回类型

    Web API控制器中的Action方法有如下几种返回类型: void HttpResponseMessage IHttpActionResult 其它类型 基于上面几种不同的返回类型,Web API ...

  8. ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题

    原文:ASP.NET WEB API微信支付通知接口,返回xml数据,微信服务器不识别问题 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/MrTra ...

  9. ASP.NET Web Api返回对象类型为JSON还是XML

    在Umbraco平台上开发过程中,我用WebApi返回JSON result给前端 前端使用React调用这个web api来获取JSON result 我写的web api方法是返回JSON 类型的 ...

随机推荐

  1. whistle手机调试工具使用简单教程

    npm全局安装 npm install -g whistle 全局启动 w2 start 启动之后,输入127.0.0.1:8899 就可以访问到whistle调试界面了: 我们主要常用几个功能: 1 ...

  2. SSRS 关于日期参数的范围限制

    在进行SSRS Report开发的时候,我们往往会有日期\时间范围限制的需求,但参数的报表参数并没有相关的事件\属性来设置. 所以,我们需要曲线救国. 这里要说的这种方法,仅支持Microsoft S ...

  3. [20191003]oracle number类型存储转化脚本.txt

    [20191003]oracle number类型存储转化脚本.txt --//完善脚本,增加支持科学记数法.比如1e4之类的写法. 2.测试:$ cat test.txt012251234100-4 ...

  4. CentOS7打开、关闭防火墙。

    CentOS7 以上机器一些命令和低版本CentOS是有些差异的,本文只针对CentOS7 以上版本. CentOS7使用firewalld打开关闭防火墙与端口1.firewalld的基本使用启动: ...

  5. hibernate之主键生成策略

    1. hibernate的主键生成器: generator元素:表示了一个主键生成器,它用来为持久化类实例生成唯一的标识 . 连接数据库的xml hibernate.cfg.xml <?xml ...

  6. C# WF 第12节 Timer控件

    本节内容: 1:Timer控件的简介 2:实例1  : 不停的弹出,恶意exe 3:实例2: :流水灯 4:实例3:给流水灯加上计时器和在规定的时间进行播放音乐 1:Timer控件的简介 2:实例1 ...

  7. 基于 lstm 的股票收盘价预测 -- python

    开始导入 MinMaxScaler 时会报错 “from . import _arpack ImportError: DLL load failed: 找不到指定的程序.” (把sklearn更新下) ...

  8. 【转】认识JWT

    1. JSON Web Token是什么 JSON Web Token (JWT)是一个开放标准(RFC 7519),它定义了一种紧凑的.自包含的方式,用于作为JSON对象在各方之间安全地传输信息.该 ...

  9. zz自动驾驶复杂环境下高精度定位技术

    今天为大家分享下,自动驾驶在复杂环境下的高精度定位技术. 定位/导航负责实时提供载体的运动信息,包括载体的:位置.速度.姿态.加速度.角速度等信息. 自动驾驶对定位系统的基本要求: 1. 高精度:达到 ...

  10. java程序:调用百度api进行情感分析

    源码: package com.jeson.ceshi; import java.util.HashMap; import org.json.JSONObject; import com.baidu. ...