当前位置: 首页 > news >正文

使用ASP.Net WebAPI构建REST服务(三)——返回值

Asp.Net WebAPI服务函数的返回值主要可以分为void、普通对象、HttpResponseMessag、IHttpActionResult e四种,本文这里简单的介绍一下它们的区别。

一、返回void

返回void一般常用于Put和Delete函数。

    public void Delete(int id)
    {
    }

当服务函数执行完成后,服务器端并不是啥都不干直接把客户端给断掉,而是发送一个标准的204 (No Content)的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?Zjpc5paH5qGjXHZpc3VhbCBzdHVkaW8gMjAxM1xQcm9qZWN0c1xXZWJBcHBsaWNhdGlvbjFcV2ViQXBwbGljYXRpb24xXGFwaVx2YWx1ZXNcMQ==?=
    X-Powered-By: ASP.NET
    Date: Fri, 02 May 2014 13:32:07 GMT

 

二、返回普通对象

返回普通对象时,服务器将返回的对象序列化后(默认是json),通过Http应答返回给客户端。例如,

    public class ValuesController : ApiController
    {
        public string Get()
        {
            return "hello";
        }
    }

此时的返回结果是:

    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Type: application/json; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/8.0
    X-AspNet-Version: 4.0.30319
    X-SourceFiles: =?UTF-8?B?Zjpc5paH5qGjXHZpc3VhbCBzdHVkaW8gMjAxM1xQcm9qZWN0c1xXZWJBcHBsaWNhdGlvbjFcV2ViQXBwbGljYXRpb24xXGFwaVx2YWx1ZXM=?=
    X-Powered-By: ASP.NET
    Date: Fri, 02 May 2014 12:54:18 GMT
    Content-Length: 7

    "hello"

异步返回普通对象:

WebAPI也是支持异步返回对象的:

    public async Task<string> Get()
    {
        await Task.Delay(100);
        return "hello";
    }

异步返回的时候,服务器异步等待函数执行完成后再将返回值返回给对象。由于这个过程对于客户端来说是透明的,这里就不列举报文了。

 

三、返回HttpResponseMessage

HttpResponseMessage是标准Http应答了,此时服务器并不做任何处理,直接将HttpResponseMessage发送给客户端。

    public HttpResponseMessage Get()
    {
        var response = Request.CreateResponse(HttpStatusCode.OK);
        response.Content = new StringContent("hello", Encoding.UTF8);
            
        return response;
    }

此时的返回结果如下:

    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Length: 5
    Content-Type: text/plain; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/8.0
    X-AspNet-Version: 4.0.30319
    X-SourceFiles: =?UTF-8?B?Zjpc5paH5qGjXHZpc3VhbCBzdHVkaW8gMjAxM1xQcm9qZWN0c1xXZWJBcHBsaWNhdGlvbjFcV2ViQXBwbGljYXRpb24xXGFwaVx2YWx1ZXM=?=
    X-Powered-By: ASP.NET
    Date: Fri, 02 May 2014 13:09:57 GMT

    hello

可以看到,这里返回的content-type仍然是原始定义的text类型,而不是json。要实现想上面的例子所示的结果,则需要将Get函数改写为如下形式

    public HttpResponseMessage Get()
    {
        return Request.CreateResponse(HttpStatusCode.OK, "hello");
    }

 

四、返回IHttpActionResult

IHttpActionResult是Web API 2中引入的一个接口,它的定义如下:

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

从它的定义可以看出,IHttpActionResult是HttpResponseMessage的一个工厂类,最终还是用于构建HttpResponseMessage返回,由于它可以取消,因而可以实现更为强大的返回功能(如流传输)。当服务函数返回IHttpActionResult对象时,服务器执行该对象的ExecuteAsync函数,并异步等待至函数完成后,获取其返回值HttpResponseMessage输出给客户端。

IHttpActionResult是WebAPI中推荐的标准返回值,ApiController类中也提供了不少标准的工厂函数方便我们快速构建它们,如BadRequest,Conflict,Ok,NotFound等,一个简单的示例如下:

    public IHttpActionResult Get(int id)
    {
        var product = products.FirstOrDefault((p) => p.Id == id);
        if (product == null)
        {
            return NotFound();
        }
        return Ok(product);
    }

 

参考文章: http://www.asp.net/web-api/overview/web-api-routing-and-actions/action-results

 
 

 

相关文章:

  • Spring事务管理4-----声明式事务管理(2)
  • fdsf
  • PowerDesigner设计的数据库 ORA-0092
  • Zabbix监控(一)-基础
  • 【嵌入式】bootloader,linux,filesystem的烧写
  • 【Unity】制作简易定时器(Timer)
  • SCCM2012之部署安装
  • Linux基础(16)文件系统
  • Windows Server 2008 R2之六活动目录域服务的卸载
  • quick cocos2d-x 3.5打包安卓apk(编译cocos2d-x的os+打apk)
  • 黑客讲故事:攻下隔壁女生路由器后,我都做了些什么【转】
  • H5播放器
  • ASP.NET 主题(Themes)FAQ
  • 查询系统数据库
  • 限制 Top-N 查询结果的记录
  • [译]CSS 居中(Center)方法大合集
  • [译]Python中的类属性与实例属性的区别
  • Android 初级面试者拾遗(前台界面篇)之 Activity 和 Fragment
  • CentOS7简单部署NFS
  • JavaScript标准库系列——Math对象和Date对象(二)
  • js继承的实现方法
  • laravel 用artisan创建自己的模板
  • node入门
  • 百度小程序遇到的问题
  • 互联网大裁员:Java程序员失工作,焉知不能进ali?
  • 如何使用 JavaScript 解析 URL
  • 新手搭建网站的主要流程
  • 智能合约Solidity教程-事件和日志(一)
  • RDS-Mysql 物理备份恢复到本地数据库上
  • 宾利慕尚创始人典藏版国内首秀,2025年前实现全系车型电动化 | 2019上海车展 ...
  • 仓管云——企业云erp功能有哪些?
  • 通过调用文摘列表API获取文摘
  • 完善智慧办公建设,小熊U租获京东数千万元A+轮融资 ...
  • ## 临床数据 两两比较 加显著性boxplot加显著性
  • #{}和${}的区别?
  • #1014 : Trie树
  • #mysql 8.0 踩坑日记
  • (3)选择元素——(14)接触DOM元素(Accessing DOM elements)
  • (NSDate) 时间 (time )比较
  • (十)DDRC架构组成、效率Efficiency及功能实现
  • (一一四)第九章编程练习
  • (原創) 如何使用ISO C++讀寫BMP圖檔? (C/C++) (Image Processing)
  • (转)Oracle 9i 数据库设计指引全集(1)
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • ***微信公众号支付+微信H5支付+微信扫码支付+小程序支付+APP微信支付解决方案总结...
  • .[hudsonL@cock.li].mkp勒索病毒数据怎么处理|数据解密恢复
  • .htaccess 强制https 单独排除某个目录
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .NET core 自定义过滤器 Filter 实现webapi RestFul 统一接口数据返回格式
  • .NET Framework 的 bug?try-catch-when 中如果 when 语句抛出异常,程序将彻底崩溃
  • .NET多线程执行函数
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • [AutoSar]BSW_Memory_Stack_003 NVM与APP的显式和隐式同步
  • [C++] new和delete
  • [Interview]Java 面试宝典系列之 Java 多线程