当前位置 > 首页 > Asp.net

【ASP.NET Web API教程】5.1 HTTP消息处理器

2012-12-7 13:15:00来源:Asp.net

注:本文是【ASP.NET Web API系列教程】的一部分,如果您是第一次看本系列教程,请先看前面的内容。

5.1 HTTP Message Handlers
5.1 HTTP消息处理器

本文引自:http://www.asp.net/web-api/overview/working-with-http/http-message-handlers

By Mike Wasson | February 13, 2012
作者:Mike Wasson |日期:2012-2-13

A message handler is a class that receives an HTTP request and returns an HTTP response. Message handlers derive from the abstract HttpMessageHandler class.
消息处理器是一个接收HTTP请求并返回HTTP响应的类。消息处理器派生于HttpMessageHandler类。

Typically, a series of message handlers are chained together. The first handler receives an HTTP request, does some processing, and gives the request to the next handler. At some point, the response is created and goes back up the chain. This pattern is called a delegating handler.
典型地,一系列消息处理器被链接在一起。第一个处理器接收HTTP请求、进行一些处理,并将该请求交给下一个处理器。在某个点上,创建响应并沿链返回。这种模式称为委托处理器(delegating handler)(如图5-1所示)。

WebAPI5-1

图中:Request:请求,Delegating Handler:委托处理器,Inner Handler:内部处理器,Response:响应

图5-1. 消息处理器链

Server-Side Message Handlers
服务器端消息处理器

On the server side, the Web API pipeline uses some built-in message handlers:
在服务器端,Web API管线使用一些内建的消息处理器:

  • HttpServer gets the request from the host.
    HttpServer获取从主机发来的请求。
  • HttpRoutingDispatcher dispatches the request based on the route.
    HttpRoutingDispatcher(HTTP路由分发器)基于路由对请求进行分发。
  • HttpControllerDispatcher sends the request to a Web API controller.
    HttpControllerDispatcher(HTTP控制器分发器)将请求发送给一个Web API控制器。

You can add custom handlers to the pipeline. Message handlers are good for cross-cutting concerns that operate at the level of HTTP messages (rather than controller actions). For example, a message handler might:
可以把自定义处理器添加到该管线上。对于在HTTP消息层面上(而不是在控制器动作上)进行操作的交叉关注,消息处理器是很有用的。例如,消息处理器可以:

  • Read or modify request headers.
    读取或修改请求报头。
  • Add a response header to responses.
    对响应添加响应报头。
  • Validate requests before they reach the controller.
    在请求到达控制器之前验证请求。

This diagram shows two custom handlers inserted into the pipeline:
下图显示了插入到管线的两个自定义处理器(见图5-2):

WebAPI5-2

图5-2. 服务器端消息处理器

On the client side, HttpClient also uses message handlers. For more information, see HttpClient Message Handlers.
在客户端,HttpClient也使用消息处理器。更多信息参阅“Http消息处理器”(本系列教程的第3.4小节 — 译者注)。

Custom Message Handlers
自定义消息处理器

To write a custom message handler, derive from System.Net.Http.DelegatingHandler and override the SendAsync method. This method has the following signature:
要编写一个自定义消息处理器,需要通过System.Net.Http.DelegatingHandler进行派生,并重写SendAsync方法。该方法有以下签名:

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

The method takes an HttpRequestMessage as input and asynchronously returns an HttpResponseMessage. A typical implementation does the following:
该方法以HttpRequestMessage作为输入参数,并异步地返回一个HttpResponseMessage。典型的实现要做以下事:

  1. Process the request message.
    处理请求消息。
  2. Call base.SendAsync to send the request to the inner handler.
    调用base.SendAsync将该请求发送给内部处理器。
  3. The inner handler returns a response message. (This step is asynchronous.)
    内部处理器返回响应消息。(此步是异步的。)
  4. Process the response and return it to the caller.
    处理响应,并将其返回给调用者。

Here is a trivial example:
以下是一个价值不高的示例:

public class MessageHandler1 : DelegatingHandler
{
protected async override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
Debug.WriteLine("Process request");
// Call the inner handler.
// 调用内部处理器。
var response = await base.SendAsync(request, cancellationToken);
Debug.WriteLine("Process response");
return response;
}
}

The call to base.SendAsync is asynchronous. If the handler does any work after this call, use the await keyword, as shown.
base.SendAsync的调用是异步的。如果处理器在调用之后有工作要做,需使用await关键字,如上所示。

A delegating handler can also skip the inner handler and directly create the response:
委托处理器也可以跳过内部处理器,并直接创建响应:

public class MessageHandler2 : DelegatingHandler
{
protected override Task<HttpResponseMessage> SendAsync(
HttpRequestMessage request, CancellationToken cancellationToken)
{
// Create the response.
// 创建响应。
var response = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StringContent("Hello!")
};

// Note: TaskCompletionSource creates a task that does not contain a delegate.
// 注:TaskCompletionSource创建一个不含委托的任务。
var tsc = new TaskCompletionSource<HttpResponseMessage>();
tsc.SetResult(response); // Also sets the task state to "RanToCompletion"
// 也将此任务设置成“RanToCompletion(已完成)”
return tsc.Task;
}
}

If a delegating handler creates the response withou


  • 微软云计算组件“Huron” –最新动态及应用截图

    2009-5-6 21:21:00

    微软同步框架团体(Microsoft Sync Framework)公布了“Huron”项目的最新开发进展。Huron是一个目前正处于筹划开发初期的项目,整个开发时间并不太长

  • 推荐阅读《Applications = Code + Markup》

    2007-10-8 15:56:00

    最近在通过一边动手做一个智能客户端的WPF应用,一边在学习WPF技术。 WPF技术跟之前的Windows Form应用两者给我的感觉是:这两个技术是一个非常大的跨越。很多Windows Fo

  • .NET中AOP的几种实现方案

    2010-12-22 18:08:00

    AOP在.NET中的应用,个人也属于学习阶段,欢迎大家拍砖! 本文的例子模拟用户注册的场景,主要通过代码演示几种方案的实现方式。 静态代理 通过装饰模式实现静态代理,大家一看代码基本就明白

  • asp.net移动Web开发之学习篇(二)

    2010-1-8 19:46:00

    阅读: 249 评论: 2 作者: 总想拥有自己的天空 发表于 2010-01-08 16:54 原文链接 1.新建一个Mobile Web Form页面,在左边的Mobile Web F

  • ASP.NET Web开发框架之六 数据库文档方法,工具和实践

    2012-9-29 9:25:00

    随着项目的进度推进,数据库的表越来越多,字段也频繁的变更。如何对这些变更作出文档说明,既要方便,又要有可维护性。比如,可以为所有的表创建WORD文档来说明,各个表的含义和字段的意义,但是如果数据库表

  • 程序员的共鸣 - 读《卓有成效的程序员》

    2009-7-18 12:35:00

    最近读了《卓有成效的程序员》,感觉收获颇大。这是一本写给程序员的难得的好书。书中大都是一些浅显的道理,但作者将这些东西加以收集、归纳、总结,并最终成书。作者为了收集各种提高效率的工具和方法,东奔西走

  • 致歉

    2007-3-1 19:39:00

    想到给那么多朋友带来的麻烦,想到大家的焦急、抱怨、责怪、宽容与理解,心情是如此复杂,不知如何面对大家! 一直在努力保证网站的稳定运行,可出现这样的意外情况,是一种打击,更是一种考验,不管内心多么难

  • TestDriven.NET 2.0——单元测试的好助手

    2007-1-22 11:48:00

    摘要: 在软件开发领域,测试驱动开发(Test Driven Development,TDD)技术在逐渐为广大开发者所接受,它是在添加新代码之前让你的测试代码出错的一种开发技术。在开始编写代码之前首

  • 十年磨一剑--缓存模块设计

    2009-12-31 13:54:00

    阅读: 550 评论: 2 作者: Kevin Zou 发表于 2009-12-31 12:12 原文链接 1.缓存是提高程序性能的一种非常重要的方式,其原理就是通过空间换取时间,在内存中

  • WCF, WF, EPM

    2007-4-16 4:49:00

    对WCF的了解还停留在2006年初看Indigo的地步。当时看了一本MS 2005年出版的《Programming Indigo》电子书,是一本非常棒的书,我只记得当时作为初学者我看第一遍的时候,对