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. Java生鲜电商平台-微服务入门与服务的拆分架构实战

    Java生鲜电商平台-微服务入门与服务的拆分架构实战 刚开始进入软件行业时还是单体应用的时代,前后端分离的概念都还没普及,开发的时候需要花大量的时间在“强大”的JSP上面,那时候SOA已经算是新技术了 ...

  2. PHP mysqli_rollback MySQLi 函数

    定义和用法 mysqli_rollback - 回退当前事务 语法: mysqli_rollback ( mysqli $link ) 参数 参数 必需的 描述 link 是 由mysqli_conn ...

  3. 开关VoLTE流程分析(一)

    开关按钮位置: 设置--> 更多--> 移动网络--> 增强型4G LTE模式 控件初始化addEnhanced4GLteSwitchPreference,该设置开关使用了Switc ...

  4. 使用AVFoundation完成照片拍摄存储相册, 开启关闭闪光灯, 切换摄像头

    在开启这个旅程之前, 请记住, AVFoundation是一个复杂的工具. 在很多情况下, 我我们使用苹果默认的API(比如:UIImagePickerController)就足够了. 在您阅读之前, ...

  5. PyCharm重命名文件时更改引用的地方

    Shift + F6 在文件夹直接更改文件名称时,其它文件里有调用这个模块的话,名称是不会改变的,只会报错,显示找不到这个模块,这时,可以在pycharm里直接更改 右键你需要改名的文件,选择Refa ...

  6. qt md5加密,base64编码解码

    qt md5加密,base64编码解码 md5加密 QByteArray data = "12121221"; data += "asdfas"; QByteA ...

  7. arm-linux-gcc-5.4.0安装方法

    首先需要下载arm-linux-gcc的安装包 这里提供一个5.4.0版本的安装包,如有需要自行下载. 下载链接:https://pan.baidu.com/s/1prpdmVNWBFzg79OXQs ...

  8. ssh-agent,ssh-add 命令

    centos 6.9 下测试: ssh-agent是一个密钥管理器,运行ssh-agent以后,使用ssh-add将私钥交给ssh-agent保管. eval `ssh-agent -s` ssh-a ...

  9. AtCoder - 2037 (dp)

    题意 https://vjudge.net/problem/AtCoder-2037 选一些数使得和的平均值等于a,问方案数. 思路 设dp[i][j]为选i个数和为j的方案数,如果当前选了x,那么d ...

  10. spring框架开发包官网各版本的下载地址

    链接地址https://spring.io/tools3/sts/legacy,推荐迅雷下载