当前位置 > 首页 > Asp.net

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

12/7/2012 1:15:00 PM来源: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


  • 做了几个编程题

    9/4/2009 5:54:00 PM

    摘要: 在快下班的时间里,稍微闲了会,做点编程题。来自:http://www.cnblogs.com/tomin/archive/2009/03/27/1423395.html的最后部分,我挑了3个

  • asp.net mvc3 自定义 AuthorizeAttribute

    3/6/2012 2:24:00 PM

    AuthorizeAttribute   AuthorizeAttribute 这个Filter实现了IAuthorization这个接口,是Asp.Net MVC提供的认证和授权功能的实现,要

  • Web框架比较

    5/23/2007 11:27:00 PM

    摘要: 对比几个常见的Web framework. 同时简单介绍了一下工作中使用Spring Web Flow的感受! 阅读全文 Anders小明 2007-05-23 22:43 发

  • Extended WebBrowser Control - Version 0.0.0.0 Uploaded

    12/2/2009 11:05:00 AM

    After a long time, I finally managed to upload a version of the Extended WebBrowser Control to C

  • 关于(VS2005)WINFORM中全角问题

    3/21/2009 8:08:00 PM

    摘要: 在程序的界面中文本框使用输入法时,总是全角,今天在测试项目时发现了这个被别人问了N次的经典问题才发现,因为我一直使用万能五笔,所以不存在全角/半角问题后来在网上搜索了有几种答案,经过测试解决

  • ASP.NET Page Methods with Parameters

    1/7/2012 6:22:00 PM

    In earlier post I have written how we can use page methods to call server-side from the java scri

  • Watch the Windows 7 Launch by Steve Ballmer (54 min Video)

    10/23/2009 1:54:00 AM

    Watch the video here

  • 怪异的IE - 2

    8/6/2009 11:41:00 AM

    文章截图 - 更好的排版 源代码下载 问题描述 前两天遇到这样的需求,动态的向页面添加CSS样式,是内联的样式而不是外部CSS文件。 和往常一样,我写下了下面的代码:

  • 对.net了解更多点【习惯对List初始化的时候分配一个值】

    8/29/2012 1:22:00 PM

    .net提供了List对象来提供可扩容数据存储,但在使用的过程中相信很多人直接通过默认构造函数进行创建。但这样做会存在一定的风险导致Lis在扩容过程增加CPU的损耗和GC的压力,对于问题的严重性就取

  • LiveHelp:方便地在Asp.net界面上添加帮助文档的方法

    3/22/2007 6:19:00 PM

    摘要: Help.htm: <h2 id=testHelp>帮助一</h2> <div> <p>some con