WebApi框架中对资源的操作,都是通过其Controller提供的各种方法(GET,POST,PUT,DELET等)来实现,而这些方法的返回信息有以下几种形式:

方法返回类型 HttpResponseMessage
void StateCode:204(No Content)
HttpResponseMessage 直接返回HttpResponseMessage
IHttpActionResult 调用ExecuteAsync方法去创建一个HttpResponseMessage 对象,让后将这个对象转换成Http响应消息
其他类型(如int,string等) 将序列化的值写到响应消息的内容中,返回StateCode:200(OK)

1:返回void的情况不多做介绍,返回给浏览器的responseMessage如下:

HTTP/ No Content
Server: Microsoft-IIS/8.0
Date: Mon,  Jan  :: GMT

2:返回HttpResponseMessage

我们自定义的HttpResponseMessage主要可以通过这种返回类型来实现,例如,自定义response的Header:

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

又例如,对方法的不同执行结果返回不同的HttpResponseMessage:

[HttpGet]
        public HttpResponseMessage GetTopic(int id)
        {
            TopicModel topic;
            using (var connection = new OracleConnection(Setting.ConnectionStr))
            {
                var sql = string.Format("select * from {0} where topicid=:TopicId", Setting.TopicModelTable);
                var condition = new
                {
                    TopicId = id
                };
                connection.Open();
                topic = connection.QueryList<TopicModel>(sql,condition, null,null).FirstOrDefault();
                connection.Close();
            }
            HttpResponseMessage resp;
            if (topic == null)
            {
                resp = new HttpResponseMessage(HttpStatusCode.NoContent)
                {
                    ReasonPhrase = "no resource found"
                };
            }
            else
            {
                resp = Request.CreateResponse(HttpStatusCode.OK, topic);
            }
            return resp;
        }

在上例中,自定义HttpResponseMessage有两种方法,一种是通过构造函数,new HttpResponseMessage,同时用JSON序列化后的实体对象创建HttpResponseMessage中的Content(通过new StringContent):

new HttpResponseMessage(HttpStatusCode.OK)
                {
                    Content = new StringContent(JsonConvert.SerializeObject(topic))
                };

另外一种是直接通过实体,自己JSON序列化后形成HttpResponseMessage:

Request.CreateResponse(HttpStatusCode.OK, topic);  //topic为实体对象

这两种创建响应信息的方式,返回给浏览器的响应略有不同,前者返回给浏览器Header如下:

HTTP/ OK
Content-Length:
Content-Type: text/plain; charset=utf-
Server: Microsoft-HTTPAPI/2.0
Date: Tue,  Jul  :: GMT

后者返回给浏览器Header如下:

HTTP/ OK
Content-Length:
Content-Type: text/json; charset=utf-
Server: Microsoft-HTTPAPI/2.0
Date: Tue,  Jul  :: GMT

区别就在于Content-Type,因此,在某些对Content-Type有特殊要求的场合需要区分。

3:没怎么用过,对HttpResponseMessage提供一定的封装。

4:直接返回自定义对象,则默认序列化为JSON对象,加上StateCode:200(OK),形成新的HttpResponseMessage返回给浏览器:

HTTP/ OK
Content-Length:
Content-Type: text/xml; charset=utf-
Server: Microsoft-HTTPAPI/2.0
Date: Tue,  Jul  :: GMT

其实HttpResponseMessage对象中的Header中的Content-Type是可以通过设置HttpRequestMessage的Header中的Accept来指定的,即内容协商机制,如下的HttpRequestMessage:

GET http://192.168.22.6:7777/api/topic/3 HTTP/1.1
User-Agent: Fiddler
Accept: text/xml
Content-Type: text/json
Host:
Content-Length: 

即协商指定接收Content-Type为text/xml,以下是服务返回的HttpResponseMessage的Header:

HTTP/ OK
Content-Length:
Content-Type: text/xml; charset=utf-
Server: Microsoft-HTTPAPI/2.0
Date: Tue,  Jul  :: GMT

由此可见,虽然服务返回的Content-Type是JSON,但最终返回给浏览器的Content-Type被协商为了XML格式。

												

REST服务返回自定义的HttpResponseMessage的更多相关文章

  1. angular(3)服务 --注入---自定义模块--单页面应用

    ng内部,一旦发生值改变操作,如$scope.m=x,就会自动轮询$digest队列,触发指定的$watch,调用其回调函数,然后修改dom树. 干货:https://github.com/xufei ...

  2. Nginx挂载维护页或返回自定义响应信息

    在服务停机升级或者服务暂不可用时,往往希望能够返回给用户更为明确和友好的响应信息.可以通过修改nginx配置文件,达到返回自定义信息的效果.有如下几种配置方式: (1)Nginx接收到的所有请求,都返 ...

  3. AngularJS内建服务以及自定义服务的用法

    在AngularJS中, 服务是一个比较重要的部分,它是一个对象或者是函数,可以在你的AngularJS的应用中使用.接下来介绍几种比较常用的内建服务以及自定义服务的方法. [内建服务] (1)loc ...

  4. springboot 404返回自定义json(只进入过滤器)

    今天在公司没事干,记一次springboot遇到的一些坑,在百度上也没有搜到类似的问题和答案(或者说 答案不是我想要的) 当我们在SpringBoot遇到了404或者500的错误的时候,你们会怎么办? ...

  5. AJAX回调函数,返回JSON格式,应该返回自定义状态STATUS,但是却返回200

    返回200应该是方法已经执行通的意思,但是没返回自定义的status,仔细一看json格式拼错了...

  6. 配合crond服务实现自定义周期备份MySQL数据库(使用innobackupex进行备份)

    备份 新建一个脚本/root/backup.py,内容如下: #!/usr/bin/env python# -*- coding: utf-8 -*- ''' 脚本作者:昨夜星辰 脚本作用:配合cro ...

  7. 客户端获取服务端自定义类数据 z

    客户端获取服务端自定义类数据 问题一:超时问题,在最后获取数据的时候突然提示服务超时,服务已断开 解决:配置文件添加: <bindings> <wsHttpBinding> & ...

  8. 阿里云容器服务--配置自定义路由服务应对DDOS攻击

    阿里云容器服务--配置自定义路由服务应对DDOS攻击 摘要: 容器服务中,除了slb之外,自定义路由服务(基于HAProxy)也可以作为DDOS攻击的一道防线,本文阐述了几种方法来应对普通规模的DDO ...

  9. Linq to Sql:N层应用中的查询(上) : 返回自定义实体

    原文:Linq to Sql:N层应用中的查询(上) : 返回自定义实体 如果允许在UI层直接访问Linq to Sql的DataContext,可以省去很多问题,譬如在处理多表join的时候,我们使 ...

随机推荐

  1. 一个优秀的Unity3d开发者必备的几种设计模式

    Unity脚本编程 众所周知,unity的编程属于脚本化,脚本没有一个具体的概念跟架构, 导致在项目过程中,经常出现哪里需要实现什么功能,就随便添加脚本, 结果,就造成了一片混乱,不好管理. 更有甚者 ...

  2. Unity游戏暂停之Update与FixedUpdate区别

    游戏暂停 示例程序 下面这段代码演示游戏暂停 using UnityEngine; using System.Collections; public class GamePauseTest : Mon ...

  3. [No00003A]操作系统Operating Systems 内核级线程Kernel Threads内核级线程实现Create KernelThreads

    开始核心级线程 内核级线程对多核的支持怎么样? 和用户级相比,核心级线程有什么不同? ThreadCreate 是系统调用,内核管理TCB ,内核负责切换线程 如何让切换成型? − − 内核栈,TCB ...

  4. luogu1003铺地毯[noip2011 提高组 Day1 T1]

    题目描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩形区域(可看做是平面直角坐标系的第一象限)铺上一些矩形地毯.一共有 n 张地毯,编号从 1 到n .现在将这些地毯按照编号从小到大的顺序平行于 ...

  5. samsung Galaxy s2(GT i9100g )刷机升级至4.4小记

    从昨天上午到现在,大部分时间都是在将i9100g更新到4.4.虽然中途也做了一些别的事情,但是更新过程还是走了一点弯路,比开始预想的稍微慢了一点,现在将完整的更新步骤分享给大家,以帮助后来的同学.升级 ...

  6. HTML 学习笔记 CSS3 (2D转换)

    2.scaleX(<number>) : 使用 [sx,1] 缩放矢量执行缩放操作,sx为所需参数.scaleX表示元素只在X轴(水平方向)缩放元素,他的默认值是(1,1),其基点一样是在 ...

  7. 数据类型之记录(record)..With XXX do begin... end;

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 type   Mai ...

  8. ASP.NET点击按钮弹出确认对话框方法

    开发asp.net网页应用程序的时候,有些页面的按钮需要增加一个确认对话框,比如: 实现这个功能比较简单,代码这样写: Button.Attributes["onclick"] = ...

  9. (转)无法打开C盘,提示"本次操作由于这台计算机的限制被取消,请与你的管理员联系”

    今天下了一个网吧用的工具一不小心把系统给限制了好多双击打开C的时候就出现本次操作由于这台计算机的限制被取消,请与你的管理员联系下载一个精锐网吧辅助工具解除了一下现在但是还是不能双击 于是就在网上找帮啊 ...

  10. log4j2 与 spring mvc整合

    log4j2不仅仅是log4j的简单升级,而是整个项目的重构,官网地址:http://logging.apache.org/log4j/2.x/,大家可以从官网的介绍看出它相比log4j第1代的种种优 ...