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不可以返回nullNullable 也就是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. Python3---爬虫Post传参

    前言 Python3 Post 传参主要用到的是urllib.request.urlopen(url,data)参数当中data.data参数主要是设置post的传参. 修改时间:20191218 天 ...

  2. 面试官之问:知道你的接口“QPS”是多少吗?

    前言: 原作:孤独烟.因修改不当之处欢迎指出! 大家好,我是小架架. 今天一大早就起来水文章了.这篇文章我个人感觉虽然含金量不是特别大,估计大家大概5分钟左右就能看完!到底是因为什么呢,因为平时干货文 ...

  3. 【转载】Android开发中巧用Activity和Fragment

    1.Activity的生命周期 1)多个Activity组成Activity栈,当前活动位于栈顶.我们先来看看各种Activity基类的类图: 当Activity类定义出来之后,这个Activity何 ...

  4. 解决iOS地图持续定位耗电问题

    地图位置刷新的代理didUpdateLocations会持续调用,手机非常耗电 但是在实际开发中,有一些APP确实需要用到持续定位的功能,比如:运动类, 导航类, 天气类等等 如何进行持续定位呢?保证 ...

  5. linux下搭建jenkins

    为了配合上一篇的ant+jenkins做持续集成,需要在linux环境下搭建一个jenkins平台.网上有很多安装的例子,我主要记录一下自己遇到的问题,真真的是特别惆怅的,每次我遇到的问题都格外多. ...

  6. 基于socketsever下实现的FTP

    # ### 客户端client import socket import json import struct import os sk = socket.socket() sk.connect( ( ...

  7. Docker Harbor

    简介: Harbor是一个用于存储Docker镜像的企业级Registry服务:本章将介绍如何搭建Harbor Registry! Github官方安装文档: https://github.com/g ...

  8. jsp页面格式化时间 fmt:formatDate格式化日期

    使用fmt函数需在jsp中引入 <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" ...

  9. adb <-> adbserver <-> JDWP

    简单理一下adb,adbserver,jdwp 之间的关系.角色与相关协议 |    上位机     | USB/TCP |   下位机      | adb <-> adbserver ...

  10. 7.Java基础_Java数据输入

    import java.util.Scanner; public class Output { public static void main(String[] args){ Scanner sc=n ...