[水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器
阅读导航
问题
如果仅仅针对指定的路由进行某些特定的消息处理,而不是应用于所有路由,我们应该怎么做呢?
解决方案
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)怎样给指定路由配置处理器的更多相关文章
- [水煮 ASP.NET Web API2 方法论](3-2)直接式路由/属性路由
问题 怎么样可以使用更贴近资源(Controller,Action)的方式定义路由. 解决方案 可以使用属性路由直接在资源级别声明路由.只要简单的在 Action 上使用属性路由 RouteAttri ...
- [水煮 ASP.NET Web API2 方法论](3-1)集中式路由
问题 怎样集中的定义路由 解决方案 通过调用 HttpRouteCollectionExtension 类中的 MapHttpRoute 扩展方法在 HttpRouteCollection 中定义路由 ...
- [水煮 ASP.NET Web API2 方法论](12-2)管理 OData 路由
问题 如何控制 OData 路由 解决方案 为了注册路由,可以使用 HttpConfigurationExtension 类中 MapODataServiceRoute 的扩展方法.对于单一路由这样 ...
- [水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置
阅读导航 问题 解决方案 工作原理 代码演示 在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅. 问题 我们在之定义过集中式路由,集中式 ...
- [水煮 ASP.NET Web API2 方法论](3-5)路由约束
问题 怎么样限制路由中参数的值. 解决方案 ASP.NET WEB API 允许我们通过 IHttpRouteConstraint 接口设置路由约束.集中式路由和直接式路由都可以使用 IHttpRou ...
- [水煮 ASP.NET Web API2 方法论](3-3)路由默认值
问题 如何为路由中参数设置默认值. 解决方案 不管使用属性路由还是集中式路由,ASP.NET WEB API 都可以很方便的为路由定义默认参数.在每次客户端请求的时候,如果客户端没有传这些参数,框架会 ...
- [水煮 ASP.NET Web API2 方法论](1-5)ASP.NET Web API Scaffolding(模板)
问题 我们想快速启动一个 ASP.NET Web API 解决方案. 解决方案 APS.NET 模板一开始就支持 ASP.NET Web API.使用模板往我们的项目中添加 Controller,在我 ...
- [水煮 ASP.NET Web API2 方法论](3-7)默认 Action 请求方式以及 NonActionAttribute
问题 在 Controller 中有一个 public 的方法,但是又不想将这个 publlic 方法暴露成为一个 API. 解决方案 ASP.NET Web API 中,正常是通过 HTTP 谓词来 ...
- [水煮 ASP.NET Web API2 方法论](3-6)万能路由
问题 定义什么样的路由,可以不会受请求参数类型和数量的限制,而被全部捕获? 解决方案 在路由模板中,给参数添加一个"*"前缀,例如 {*param},只要请求的 URL 能够和路由 ...
随机推荐
- CocoSocket开源下载与编写经验分享
CocoSocket分享 cocos2dx 3.1都出了,但依然没有发现与它原生的SOCKET支持,于是,这几天在家,手工撸了一个. 目前版本对IOS,ANDROID,WINDOWS支持良好.且为异步 ...
- 微软 Build 2016年开发者大会发布多项功能升级
微软Build 2016开发者大会在美国旧金山的莫斯康展览中心开幕.本次大会对一些重点功能进行了完善.如手写笔支持技术Windows Ink.语音识别Cortana应用集(Cortana Collec ...
- AngularJS快速入门指南13:表单
一个AngularJS表单是一组输入型控件的集合. HTML控件 HTML输入型标签标包括: input标签 select标签 button标签 textarea标签 HTML表单 HTML表单将各种 ...
- IOS 多线程01-线程基础知识
大部分现代操作系统,包括IOS,都支持执行线程的概念.每个进程可以包含多个线程,他们可以同时运行.如果只有一个处理器核心,操作系统将在所有执行线程之间切换,非常类似于在所有执行线程之间切换.如果拥有多 ...
- MVVM架构~knockoutjs系列之正则表达式使规则更灵活
返回目录 几乎每种验证架构都会有正则表达式的加盟,一般地,一种验证架构首先会提供一些标准的,常用的验证规则,它们通常是数字验证,电话验证,email验证,长度验证,范围验证,日期验证等,而如果使你的验 ...
- PHPer书单
想提升自己,还得多看书!多看书!多看书! 下面是我收集到的一些PHP程序员应该看得书单及在线教程,自己也没有全部看完.共勉吧! Github地址:https://github.com/52fhy/ph ...
- Lua 协程coroutine
协程和一般多线程的区别是,一般多线程由系统决定该哪个线程执行,是抢占式的,而协程是由每个线程自己决定自己什么时候不执行,并把执行权主动交给下一个线程. 协程是用户空间线程,操作系统其存在一无所知,所以 ...
- Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js
Atitit usbQb212 oo 面向对象封装的标准化与规范解决方案java c# php js 1.1. 封装性是面象对象编程中的三大特性之一 三个基本的特性:封装.继承与多态1 1.2. 魔 ...
- UVAoj 348 - Optimal Array Multiplication Sequence
/* 题意:矩阵相乘的最少的步数 dp[i][j]=min(dp[i][j], dp[i][k]+dp[k+1][j]+num[i-1]*num[k]*num[j]); 表示的是第i个矩阵到第j个矩阵 ...
- ASP.NET和IIS工作原理
图为iis6.0运行asp.net的原理. browser向iis发送HTTP请求,HTTP.SYS将其分发给W3SVC(World Wide Web Publishing Service),后者解析 ...


