[水煮 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 能够和路由 ...
随机推荐
- ASP.NET中一种超简单的Ajax解决方案
为什么是Ajax2? 因为之前有一个blqw.Ajax,并且已经在项目中投入使用了,但是没有这个方便,这个是后来才弄的,为了纪念第一版的blqw.Ajax,所以这个就2了... 话说看了评论才发现,原 ...
- 泛型实现中没有正确lock引用类型的一个隐藏bug分析
最近看到这篇文章dotNetDR_的回复,让我想起一个真实发生的案例,下面就简单说说这个关于lock引用类型的一个不容易发现的隐藏缺陷. 某类库中的代码,封装了很简单的一个通用类,用于线程安全地执行某 ...
- struts2学习笔记之五:表单数据收集的几种方式
方法一:struts2对ModelDriven模式的支持(模型驱动模式) Struts2可以采用类似于Struts1中的ActionForm方式收集数据,这样方式叫ModelDriven模式 Acti ...
- Permission is only granted to system apps
原文地址http://jingyan.baidu.com/article/9113f81b2e7a8c2b3314c711.html
- css自适应宽高等腰梯形
t1是梯形, ct是梯形里面的内容. 梯形的高度会随着内容的高度撑高.宽度随着浏览器窗口变宽. 梯形上窄下宽或上宽下窄可以通过 transform 的大小来修改. <div class=&quo ...
- Piwik 扩展获取客户端IP地址
piwik 数据库浏览记录存放在piwik_log_visit表中 piwik_log_visit 表有个location_ip字段,该字段存储为Byte[]字节 解析出来后的IP地址为 XXX.XX ...
- fir.im Weekly - 你与优秀源码之间只差一个 Star
说起开源社区,Github 是一个不可缺少的存在.作为全球最大的同性交友网站,上面有太多优秀的开源代码库和编程大神,让无数开发者心生向往.那么如何正确的使用 Github,也许是编程学习之必要.来看下 ...
- fir.im Weekly - 如何打造 Github 「爆款」开源项目
最近 Android 转用 Swift 的传闻甚嚣尘上,Swift 的 Github 主页上已经有了一次 merge>>「Port to Android」,让我们对 Swift 的想象又多 ...
- Open Cascade Data Exchange STL
Open Cascade Data Exchange STL eryar@163.com 摘要Abstract:介绍了三维数据交换格式STL的组成,以及Open Cascade中对STL的读写.并将O ...
- WPF自定义控件与样式(5)-Calendar/DatePicker日期控件自定义样式及扩展
一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: 日历控 ...