阅读导航

问题

解决方案

工作原理

代码演示

问题

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

解决方案

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. 【开源】开发者新闻聚合APP 1.0.3发布(第一个稳定版本,短期内不再发布新版本)

    聚合了博客园新闻.infoq新闻.36kr新闻.oschina新闻.51cto新闻.csdn新闻: 争取做到随时刷随时有开发者的新闻! 目前还只支持安卓APP 最新版本的下载地址:https://gi ...

  2. JavaScript包装对象

    JavaScript是面向对象的语言,使用”.”操作符可以访问对象的属性和方法,而对于基本类型(null, undefined, bool, number, string)应该是值类型,没有属性和方法 ...

  3. 手把手教你做一个原生js拖动滑块【兼容PC和移动端】

    废话少说: 在PC端可以用mousedown来触发一个滑块滑动的效果,但在手机上,貌似无法识别这个事件,但手机上有touchstart事件,可以通过一系列"touch"事件来替代P ...

  4. 知方可补不足~SQL2008中的发布与订阅模式~续

    回到目录 上一回介绍了如何在sql2008中建立一个数据库的发布者,今天来说一下如何建立一个订阅者,其实订阅者也是一个数据库,而这个数据库是和发布者的数据结构相同的库,它们之间通过SQL代理进行数据上 ...

  5. ELK日志应用平台搭建

    ELK架构: ElasticSearch:用于存储.索引日志. Logstash:用于收集.处理和转发事件或日志信息的工具. Kibana:搜索和可视化的日志的WEB界面. ELK优点: a.处理方式 ...

  6. 发现一个百度的密码。。。记最近一段时间的php感想

    请看图. 突然想看一下百度的cookie. 最近百度一年真是多攒多难,我一直挺百度啊.百度文化就是程序员文化,但是收到中国其他文化的侵蚀,不得不变, 任何人重构系统,都会有大概百分三十左右的性能提升. ...

  7. AngularJS中Directive指令系列 - scope属性的使用

    文章是转的,我做下补充.原文地址:https://segmentfault.com/a/1190000002773689 每当一个指令被创建的时候,都会有这样一个选择,是继承自己的父作用域(一般是外部 ...

  8. C# string.format、string.connect和+=运算 效率计算

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Stri ...

  9. 使用swoole和websocket结合来制造弹幕

    在知乎上无意中看到了一篇有关这个的话题https://zhuanlan.zhihu.com/p/23992890,刚好没事也好久没弄swoole了就自己按照知乎上的那篇文站实操了一下 那个试验中有几个 ...

  10. CCNA网络工程师学习进程(1)网络的基本概述

        在互联网快速发展的今天,了解互联网成为一项必须的技能,因此在学习编程之余学习如何配置网络还是很有必要的. 本系列博客计划分为三个部分,包括思科CCNA.CCNP和华为的网络工程师认证有关的知识 ...