阅读导航

问题

解决方案

工作原理

代码演示

问题

如果仅仅针对指定的路由进行某些特定的消息处理,而不是应用于所有路由,我们应该怎么做呢?

解决方案

ASP.NET WEB API 的很多功能都内建了消息处理器。他们真正的威力是为消息的全局处理以及为全局的应用程序业务处理提供比较简单的处理机制。不过,在某一些场景下的需求是,使用消息处理器处理应用程序指定部分的特定行为。

我们要基于每个路由配置消息处理器(DelegatingHandler),而不是在 HttpConfiguration 中注册全局的。在 HttpRouteCollectionExtension 中有一个重载的 MapHttpRoute 方法 ,他是可以做到。

public static IHttpRoute(this HttpRouteCollection routes,string name,string routeTemplate,object defaults,object contraints,HttpMessageHandler handler)

注意 只能在集中式路由中使用,而不能在属性路由中使用。

工作原理

在 Web API 管道中,基于路由的消息处理器是在全局消息处理器之后,HttpControllerDispatcher 之前执行。一个叫做 HttpRouteDispatcher 的服务来负责识别给定路由是否指定了消息处理器。如果是的话,请求将交由处理器处理,否则,继续处理,匹配 Controller。

指定路由处理器需要指定 InnerHandler 来继续处理消息。我们必须添加一个指定路由处理器,或者,将请求交还给 HttpControllerDispatcher,如代码片段 3-22 所示。使用这个技术,只要在最后添加 HttpControllerDispatcher,在路由上可以有很多处理器,如果最后不添加 HttpControllerDispatcher 的话,就请求不到任何 Controller。

代码片段 3-22.使用指定路由处理器

 

这个可以给开发者提供很多灵活性的东西,尤其是,基于身份认证相关的场景,只要在需要身份认证的路由中增加安全相关的处理器。

代码演示

记录路由 /api/[sometink] 的日志,而不需要记录 /api/public/[something] 的。那么,我们需要消息处理器应用在指定的路由上,而不是在全局上处理所有的请求。

首先,我们做一个简单的 API 请求日志记录处理器,如代码片段 3-23 所示。

代码片段 3-23. 日志消息处理器,仅仅作用在指定的路由上。

在这里,我们没有必要深究 Request/Response 日志的实际实现方式。为了完成代码演示,我们只要将日志记录到内存中就可以。我们主要的关注点是在处理器作用在指定路由的机制。需要注意的是,要传 ASP.NET WEB API HttpConfiguration 对象给处理器。如代码片段 3-24 所示。

代码片段 3-24. 常规路由的注册与有处理器的注册

如果应用程序启动的话,效果应该如下

  • 所有 /api/public/[something] 相关的请求不会被记录 Request/Response 的日志。
  • 所有 /api/[something] 相关的请求会被记录 Request/Response 的日志,这主要是因为,上面的配置只是对这样的路由添加了处理器。

[水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器的更多相关文章

  1. [水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由

    问题 怎么样可以使用更贴近资源(Controller,Action)的方式定义路由. 解决方案 可以使用属性路由直接在资源级别声明路由.只要简单的在 Action 上使用属性路由 RouteAttri ...

  2. [水煮 ASP.NET Web API2 方法论](3-1)集中式路由

    问题 怎样集中的定义路由 解决方案 通过调用 HttpRouteCollectionExtension 类中的 MapHttpRoute 扩展方法在 HttpRouteCollection 中定义路由 ...

  3. [水煮 ASP.NET Web API2 方法论](12-2)管理 OData 路由

    问题 如何控制 OData 路由 解决方案 为了注册路由,可以使用  HttpConfigurationExtension 类中 MapODataServiceRoute 的扩展方法.对于单一路由这样 ...

  4. [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置

    阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...

  5. [水煮 ASP.NET Web API2 方法论](3-5)路由约束

    问题 怎么样限制路由中参数的值. 解决方案 ASP.NET WEB API 允许我们通过 IHttpRouteConstraint 接口设置路由约束.集中式路由和直接式路由都可以使用 IHttpRou ...

  6. [水煮 ASP.NET Web API2 方法论](3-3)路由默认值

    问题 如何为路由中参数设置默认值. 解决方案 不管使用属性路由还是集中式路由,ASP.NET WEB API 都可以很方便的为路由定义默认参数.在每次客户端请求的时候,如果客户端没有传这些参数,框架会 ...

  7. [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)

    问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...

  8. [水煮 ASP.NET Web API2 方法论](3-7)默认 Action 请求方式以及 NonActionAttribute

    问题 在 Controller 中有一个 public 的方法,但是又不想将这个 publlic 方法暴露成为一个 API. 解决方案 ASP.NET Web API 中,正常是通过 HTTP 谓词来 ...

  9. [水煮 ASP.NET Web API2 方法论](3-6)万能路由

    问题 定义什么样的路由,可以不会受请求参数类型和数量的限制,而被全部捕获? 解决方案 在路由模板中,给参数添加一个"*"前缀,例如 {*param},只要请求的 URL 能够和路由 ...

随机推荐

  1. [stm32] NRF24L01+USART搞定有线和无线通信

    前言 一般进行远程监控时,2.4G无线通信是充当远程数据传输的一种方法.这时就需要在现场部分具备无线数据发送装置,而在上位机部分由于一般只有串口,所以将采集到的数据送到电脑里又要在上位机端设计一个数据 ...

  2. 自动更新Chromium

    Chromium 其实就是开发版本的Chrome, 即Chrome dev 版本.一般他的版本要比正式版的Chrome高两个及以上.比如正式版本现在是29,开发者版本已经是32了. 这表示很多新功能你 ...

  3. 移动 Web 触摸与运动解决方案 AlloyTouch 开源啦

    传送门 Github地址:https://github.com/AlloyTeam/AlloyTouch 简介 AlloyTouch的本质是运动一个数字,把数字的物理变化映射到你想映射的任何属性上.所 ...

  4. [Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例二.

    为了更好的排版, 所以将IK分词器的安装重启了一篇博文,  大家可以接上solr的安装一同查看.[Linux]Linux下安装和配置solr/tomcat/IK分词器 详细实例一: http://ww ...

  5. [Spring框架] Spring中的 ContextLoaderListener 实现原理.

    前言: 这是关于Spring的第三篇文章, 打算后续还会写入AOP 和Spring 事务管理相关的文章, 这么好的两个周末 都在看code了, 确实是有所收获, 现在就来记录一下. 在上一篇讲解Spr ...

  6. C#设计模式-单例模式

    单例模式三种写法: 第一种最简单,但没有考虑线程安全,在多线程时可能会出问题…… public class Singleton { private static Singleton _instance ...

  7. iOS-数据持久化基础-JSON与XML数据解析

    解析的基本概念 所谓“解析”:从事先规定好的格式串中提取数据 解析的前提:提前约定好格式.数据提供方按照格式提供数据.数据获取方按照格式获取数据 iOS开发常见的解析:XML解析.JSON解析 一.X ...

  8. Git使用命令

    git init 初始化仓库 git init --bare 初始化一个裸仓库 git branch 查看本地分支 git branch -a 查看全部分支 git remote 远程仓库管理 add ...

  9. Create New Commands in Tcl

    Create New Commands in Tcl eryar@163.com 摘要Abstract:Tcl/Tk脚本可以很容易实现用户自定义的命令,方便的创建图形化的用户界面GUI,所以Tcl和T ...

  10. 用MVVM做了一个保存网页的工具-上篇

    前言: 你是否有过收藏了别人博客或文章,当想用的时候却找不到?你是否有过收藏了别人博客或文章,却因为没有网络而打不开网页?OK,下面是我做的一个工具,有兴趣的同学们可以download 玩下,哈哈^. ...