Ø  前言

在 Web API 中经常会使用到 HttpRequestMessage 和 HttpResponseMessage 对象,这两个对象封装了对 Web API 的请求和响应,位于 System.Net.Http.dll 程序集的 System.Net.Http 命名空间中。它们是 Web API 处理请求和响应消息的两个重要对象,也是与程序员打交道最直接的两个对象。本文主要讨论以下几点:

1.   System.Net.Http.HttpRequestMessage 的应用场景。

2.   System.Net.Http.HttpRequestMessage 对象的常用属性。

1.   System.Net.Http.HttpRequestMessage 的应用场景

1)   继承与 System.Net.Http.DelegatingHandler 类的消息处理程序

1.   应用包括:请求参数验证、授权验证、日志记录、自定义响应参数等。

2.   示例:

1)   申明消息处理程序

public class CustomerHandler : DelegatingHandler

{

protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)

{

//这里:请求参数验证、授权验证、日志记录、自定义响应参数等

base.SendAsync(request, cancellationToken);

}

}

2)   注册全局消息处理程序,在 WebApiConfig.Register() 方法中加入代码:

config.MessageHandlers.Add(new CustomerHandler());

2)   Web API 接口申明

[Route("getBindOrderInfo"), HttpGet]

public HttpResponseMessage GetBindOrderInfo(HttpRequestMessage request, long orderId)

{

return CreateHttpResponse(request, () =>

{

//这里:查询数据等

return request.CreateResponse<bool>(HttpStatusCode.OK, true);

});

}

2.   System.Net.Http.HttpRequestMessage 对象的常用属性

1)   Content,获取或设置 HTTP 消息的内容。该属性是一个 System.Net.Http.HttpContent 类型,声明如下:

public HttpContent Content { get; set; }

2)   Headers,获取 HTTP 请求标头的集合。该属性是一个 System.Net.Http.Headers.HttpRequestHeaders 类型,声明如下:

public HttpRequestHeaders Headers { get; }

3)   Method,获取或设置 HTTP 请求信息使用的 HTTP 方法。该属性是一个 System.Net.Http.HttpMethod 类型,声明如下:

public HttpMethod Method { get; set; }

4)   Properties,获取 HTTP 请求的属性集。该属性是一个 object 类型的字典类型,声明如下:

public IDictionary<string, object> Properties { get; }

1.   获取 System.Web.HttpContextBase 对象

System.Web.HttpContextBase httpContextBase = httpRequest.Properties["MS_HttpContext"] as System.Web.HttpContextWrapper;

Ø  该对象的实际类型是 System.Web.HttpContextWrapper 类型,直接继承于 System.Web.HttpContextBase 类。

2.   获取 System.Web.Http.Controllers.HttpRequestContext 对象

System.Web.Http.Controllers.HttpRequestContext httpRequestContext = httpRequest.Properties["MS_RequestContext"] as System.Web.Http.Controllers.HttpRequestContext;

Ø  该对象的实际类型是 System.Web.Http.WebHost.WebHostHttpRequestContext 类型,但是访问级别是 internal(程序集内部访问),直接继承于 System.Web.HttpContextBase 类。

3.   获取 System.Threading.SynchronizationContext 对象

System.Threading.SynchronizationContext synchronizationContext = httpRequest.Properties["MS_SynchronizationContext"] as System.Threading.SynchronizationContext;

Ø  该对象的实际类型是 System.Web.AspNetSynchronizationContext 类型,但是访问级别是 internal(程序集内部访问),间接继承于 System.Threading.SynchronizationContext 类。

4.   获取 System.Web.Http.HttpConfiguration 对象

System.Web.Http.HttpConfiguration HttpConfiguration = httpRequest.Properties["MS_HttpConfiguration"] as System.Web.Http.HttpConfiguration;

Ø  该对象是一个唯一的全局对象,与 WebApiConfig.Register() 方法的 config 参数是同一个实例。

5)   RequestUri,获取或设置 HTTP 请求的 System.Uri。该属性是一个 System.Uri 类型,声明如下:

public Uri RequestUri { get; set; }

Ø  总结

本文简单的介绍了 HttpRequestMessage 对象,对该对象有了一个初步的认识。其实,只了解这些,还是远远不够的。

更多学习可参考:

http://www.cnblogs.com/wk1234/archive/2012/05/07/2486872.html

ASP.NET Web API 2 之 HttpRequestMessage 对象的更多相关文章

  1. ASP.NET Web API路由系统:路由系统的几个核心类型

    虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分(定义在程序集System.Web.Http.dll中)已经移除 ...

  2. ASP.NET Web API标准的“管道式”设计

    ASP.NET Web API的核心框架是一个消息处理管道,这个管道是一组HttpMessageHandler的有序组合.这是一个双工管道,请求消息从一端流入并依次经过所有HttpMessageHan ...

  3. Self Host模式下的ASP. NET Web API是如何进行请求的监听与处理的?

    构成ASP.NET Web API核心框架的消息处理管道既不关心请求消息来源于何处,也不需要考虑响应消息归于何方.当我们采用Web Host模式将一个ASP.NET应用作为目标Web API的宿主时, ...

  4. ASP.NET Web API框架揭秘:路由系统的几个核心类型

    ASP.NET Web API框架揭秘:路由系统的几个核心类型 虽然ASP.NET Web API框架采用与ASP.NET MVC框架类似的管道式设计,但是ASP.NET Web API管道的核心部分 ...

  5. ASP.NET Web API 路由对象介绍

    ASP.NET Web API 路由对象介绍 前言 在ASP.NET.ASP.NET MVC和ASP.NET Web API这些框架中都会发现有路由的身影,它们的原理都差不多,只不过在不同的环境下作了 ...

  6. ASP.NET Web API的核心对象:HttpController

    ASP.NET Web API的核心对象:HttpController 对于ASP.NET Web API来说,所谓的Web API定义在继承自ApiController的类中,可能ApiContro ...

  7. 解决ASP.NET Web API Json对象循环参考错误

    前言 一般我们在开法 ASP.NET Web API 时,如果是使用 Entity Framework 技术来操作数据库的话,当两个 Entity 之间包含导览属性(Navigation Proper ...

  8. HttpActionDescriptor,ASP.NET Web API又一个重要的描述对象

    HttpActionDescriptor,ASP.NET Web API又一个重要的描述对象 通过前面对“HttpController的激活”的介绍我们已经知道了ASP.NET Web API通过Ht ...

  9. 利用查询条件对象,在Asp.net Web API中实现对业务数据的分页查询处理

    在Asp.net Web API中,对业务数据的分页查询处理是一个非常常见的接口,我们需要在查询条件对象中,定义好相应业务的查询参数,排序信息,请求记录数和每页大小信息等内容,根据这些查询信息,我们在 ...

随机推荐

  1. Codeforces | CF1029C 【Maximal Intersection】

    论Div3出这样巨水的送分题竟然还没多少人AC(虽说当时我也没A...其实我A了D...逃) 这个题其实一点都不麻烦,排序都可以免掉(如果用\(priority \_ queue\)的话) 先考虑不删 ...

  2. luogu3621 城池攻占 (倍增)

    好像所有人都写的左偏树 但我不会啊233 首先发现乘的时候 系数不会为负,所以能得到一个关键条件:变化后的战斗力随变化前的战斗力大小单调 所以我们考虑倍增 设hp[x][i]是从x开始一路攻克$2^i ...

  3. 【linux】linux查找功能

    linux系统中我们经常会需要查找某些文件,当有时候我们不确定一个文件的位置,比如某服务配置文件具体路径,自己没有头绪去寻找的话会很难找,也会耽误时间.linux就提供了很多命令,find,locat ...

  4. request.getRequestDispatcher 页面跳转,样式丢失。

    在页面中引用样式和其它资源的时候,尽量不要用相对路径,因为"当前路径"这个概念在J2EE中是不稳定的. 所以最好都是绝对路径,类似于: <% String cp = requ ...

  5. C# Winform窗体基础属性

    窗口样式: Inco:改图标样式: MaxmizeBox:true:显示右上角最大化按钮: MinmizeBox:true:显示右上角最小化按钮: ShowInco:true:显示左上角小图标: Sh ...

  6. luogu3731 新型城市化

    题目链接 思路 这道题对于题意的转化很关键. 题目要求的是添上一条边,使得图中最大团的大小变大.给出的边是原图的补集,这就给我们了提示. 因为题目中说,原图中最多有两个团.所以给出的边一定形成了一个二 ...

  7. C/C++ 动态存储分配 malloc calloc realloc函数的用法与区别

    C++内存分配 https://blog.csdn.net/zhangxiao93/article/details/43966425

  8. 一个时间上的比较 if else

    if (w<b.w) ; if (w>b.w) ; if (w<b.w) ; else if (w>b.w) ; 对于任何情况,执行的次数都是一样.只是对于汇编的代码,第二个方 ...

  9. Hibernate 二(一级缓存,多表设计之一对多)

    1       对象状态与一级缓存 1.1   状态介绍 l  hibernate 规定三种状态:瞬时态.持久态.脱管态 l  状态 瞬时态:transient,session没有缓存对象,数据库也没 ...

  10. python 类的介绍实例

    使用面向对象的优点: 1.能够更好的设计软件架构 2.维护软件模块 3.易于架构和组件的重用 类的定义: 构造函数:初始化用,写不写都可以,默认为空 类属性:属于类的对象 方法属性:不属于类的对象 私 ...