当前位置 > 首页 > 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


  • 把Sql数据转换为业务数据的几种方法

    2007-7-27 9:16:00

    摘要: ORM系统必须把数据库中的数据转换为业务数据,转换的方法大致有3种,本文就试图对它们做一些简单分析。 1、属性反射。就是通过反射,获取业务实体类的各个属性,然后再设置这些属性的值。这个方法最

  • 使用UI Automation库用于UI自动化测试

    2009-11-15 1:11:00

    阅读: 253 评论: 3 作者: CoderZh 发表于 2009-11-14 21:13 原文链接 UI Automation也不是什么新东西了,很久以前曾经用过一次,最近又在一个测试

  • PowerShell and SQL Server 2008

    2009-6-4 22:44:00

    The Msft Scripting Guys rock! ;-) First of all . . .Did you know you can Email

  • ILMerge as NAnt Task

    2009-11-12 11:57:00

    I needed to merge a few a few assemblies into one, and tried pretty much what the author of this b

  • 三分钟免费搞定网站在线客服 源代码(利用了PowerTalkBox控件制作而成)

    2009-9-24 17:14:00

    摘要: 三分钟免费搞定网站在线客服 源代码(利用了PowerTalkBox控件制作而成) 作者资料: powertalkbox 我的主页 个人资料 我的闪存 与我联系 -

  • 如果你也是.NET程序员

    2010-9-30 20:37:00

    作者: xx念 发表于 2010-09-30 17:07 原文链接 阅读: 1065 评论: 24 我是一名杯具的.NET程序员。学校里学的稍微过得去的只有c语言。毕业的时候总算有家公

  • Jquery源码分析之一:概述及jquery对象的构建

    2009-5-31 10:06:00

    摘要: 1、概述 jQuery是一个非常优秀的JS库,与Prototype,YUI,Mootools等众多的Js类库相比,它剑走偏锋,从web开发实用的角度出发,抛除了其它Lib中一些不实用的东西

  • Variations on a simple repeater in ASP.NET MVC: A table/gallery

    2010-1-18 10:56:00

    There are times where Ive decided that I didnt want to get too deep into a mess of markup in my vie

  • 纯CSS星级评价

    2010-1-13 15:48:00

    阅读: 437 评论: 4 作者: 古道 发表于 2010-01-13 13:06 原文链接 做一个星级评价的功能不是很难,但是要单纯用CSS写估计就有点难度了,先来个截图:

  • vs2008 asp.net无限层次权限菜单树(二)

    2011-1-27 13:47:00

    vs2008 asp.net无限层次权限菜单树(一)中所实现的树并不能满足权限设置要求,现在要实现的效果如图1.1所示 图(1.1) 每个可设置权限的子节点 旁边还需要设置权限的类型,比如维护