阅读导航

问题

解决方案

工作原理

代码演示

在此解释一下,空气路由,是本人臆想出来,觉着更能表达 IgnoreRoute 的意图,如果看着辣眼睛^^,请见谅。

问题

我们在之定义过集中式路由,集中式路由有一个特点就是短路,但是现在我们不想让某些路由工作(匹配并由路由引擎处理请求)。那么我们应该怎么办呢?

解决方案

其实思路很简单,就是想把某些路由忽略了。ASP.NET WEB API 提供了一个叫做的 StopRoutingHandler 的处理器,简单说,他就是一个消息处理器,可以通过他来强制指定的路由被忽略掉。他是 System.Web.Http 的一部分,从 Web API 2.1 开始被引入的。StopRoutingHandler 处理器作用在指定路由上的表现就是,强制 HttpRouteDispatcher 把该路由当成空气。

注意 ASP.NET MVC 有自己把版本的StopRoutingHandler(位于 Systme.Web)。如果 ASP.NET WEB API 运行在一个完全的 ASP.NET 运行时之上,同时有权限访问 System.Web 的话,那么,一样会对 ASP.NET WEB API 起作用。

工作原理

ASP.NET WEB API 会匹配所有他能够的匹配到的请求,如果发现那些路由的被忽略的,他就不会去处理他。这也可能是一个对静态文件的请求,这样的请求必须有服务器层面来处理,或者说,如果运行了一个 OWIN 管道,他是需要被指定的 OWIN 中间件调用处理的。

注意 OWIN 中间件是顺序处理的,如果 在 OWIN 管道最开始就注册了ASP.NET WEB API,通常是需要在 ASP.NET WEB API 路由的合适位置做忽略处理。

HttpRoutingDispatcher 已经在上一篇 [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器

中提到,他是专门的消息处理器,他的职责是检查路由的 IHttpRoute 是不是匹配当前请求,同时,委托处理程序处理 HttpControllerDispatcher。HttpRoutingDispatcher 是通过 Http Server 调用的。

HttpRoutingDispatcher 会检查路由是否有处理器,如果有的话,会继续检查是否是 StopRoutingHandler 类型的,如果也是的话,那么这个请求就会被路由引擎当作空气。这个逻辑是是通过 ASP.NET WEB API 的源代码推断出来的,如代码片段 3-25 所示。

代码片段 3-25. 从 ASP.NET WEB API 源码中摘取的一部分,展示了如何使用 StopRoutingHandler 以及如何成空气的。

 protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken
cancellationToken)
{
IHttpRouteData routeData = request.GetRouteData();
if (routeData == null)
{
routeData = _configuration.Routes.GetRouteData(request);
if (routeData != null)
{
request.SetRouteData(routeData);
}
}
if (routeData == null || (routeData.Route != null && routeData.Route.Handler is
StopRoutingHandler))
{
request.Properties.Add(HttpPropertyKeys.NoRouteMatched, true);
return Task.FromResult(request.CreateErrorResponse(
HttpStatusCode.NotFound,
Error.Format(SRResources.ResourceNotFound, request.RequestUri),
SRResources.NoRouteData));
}
routeData.RemoveOptionalRoutingParameters();
var invoker = (routeData.Route == null || routeData.Route.Handler == null)
? _defaultInvoker
: new HttpMessageInvoker(routeData.Route.Handler, disposeHandler: false);
return invoker.SendAsync(request, cancellationToken);
}

代码演示

为了在 ASP.NET WEB API 中配置空气路由,可以使用来个两种语法结果(让我想起,骆驼祥子中,“回”字的几种写法)。

  • 与上篇 [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器 中的例子很像,就是在想要设置成空气路由中的消息处理器的位置使用 StopRoutinngHandler。如代码片段 3-26 所示。这个例子中,所有能够匹配到 /content/* 的请求,会被 WEB API 当作空气路由,其余的还是会被 /{controller}/{id} 定义的路由所匹配。
  • 一个更简单的方式就是使用 HttpRouteCollectionExtension 类的扩展方法 IgnoreRoute。其实内部做的是一样的事情,在指定的路由上使用 StopRoutingHandler。如代码片段 3-17 所示。

代码片段 3-26. 显示的使用 StopRoutingHandler 来设置空气路由。

config.Routes.MapHttpRoute(
name: "Content",
routeTemplate: "content/{*params}",
defaults: null,
constraints: null,
handler: new StopRoutingHandler()); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new {id = RouteParameter.Optional}
);

代码片段 3-27. 通过扩展方法 IgnoreRoute 设置空气路由。

config.Routes.IgnoreRoute(
routeName: "Content",
routeTemplate: "content/{*params}"
); config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "{controller}/{id}",
defaults: new {id = RouteParameter.Optional}
);

[水煮 ASP.NET Web API2 方法论](3-9)空气路由的设置的更多相关文章

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

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

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

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

  3. [水煮 ASP.NET Web API2 方法论](3-4)设置路由可选项

    问题 怎么样创建一个路由,不管客户端传不传这个参数,都可以被成功匹配. 解决方案 ASP.NET WEB API 的集中式路由和属性路由都支持路由声明可选参数. 在用集中式路由中可以通过 RouteP ...

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

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

  5. [水煮 ASP.NET Web API2 方法论](3-8)怎样给指定路由配置处理器

    阅读导航 问题 解决方案 工作原理 代码演示 问题 如果仅仅针对指定的路由进行某些特定的消息处理,而不是应用于所有路由,我们应该怎么做呢? 解决方案 ASP.NET WEB API 的很多功能都内建了 ...

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

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

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

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

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

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

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

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

随机推荐

  1. var与this,{}与function 小记

    JavaScript var是用来定义一个变量,this常用来定义或调用一个属性或方法.但是在全局范围内,this和var定义变量是等价的. window console.log('window:', ...

  2. [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门

    [.net 面向对象程序设计进阶] (2) 正则表达式 (一) 快速入门 1. 什么是正则表达式? 1.1 正则表达式概念 正则表达式,又称正则表示法,英文名:Regular Expression(简 ...

  3. html5 css3实现图中结构

    <!DOCTYPE html> <html lang="en" > <head> <title>demo</title> ...

  4. python property

    python property 在2.6版本中,添加了一种新的类成员函数的访问方式--property. 原型 class property([fget[, fset[, fdel[, doc]]]] ...

  5. 5、CC2541芯片中级教程-OSAL操作系统(PWM+看门狗)

    本文根据一周CC2541笔记汇总得来—— 适合概览和知识快速索引—— 全部链接: 中级教程-OSAL操作系统\OSAL操作系统-实验01 OSAL初探 [插入]SourceInsight-工程建立方法 ...

  6. 利用html 5 websocket做个山寨版web聊天室(手写C#服务器)

    在之前的博客中提到过看到html5 的websocket后很感兴趣,终于可以摆脱长轮询(websocket之前的实现方式可以看看Developer Works上的一篇文章,有简单提到,同时也说了web ...

  7. 对Google cloud platform 做了点研究

    Google也推出了云计算基础服务, 加上微软Azure,亚马逊AWS, 都齐活了. 下面是研究了一下对其的一个初步了解. 计算: Compute Engine     IaaS平台,提供VM,操作灵 ...

  8. CentOS Linux系统下安装Redis过程和配置参数说明

    转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/102.html?1455869303 安装过程: 代码如下: wget h ...

  9. fir.im Weekly - 不能错过的 GitHub Top 100 开源库

    好的工具&资源,会带来更多的灵感.本期 fir.im Weekly 精选了一些实用的 iOS,Android 的使用工具和源码分享,还有前端.UI方面的干货.一起来看下:) Swift 开源项 ...

  10. 更新日志 - fir.im Jenkins & Gradle 插件上线

    最近 fir.im 工程师们效率爆表,fir.im 实用工具集合又添加了新的成员-- Jenkins & Gradle 插件,让 App 打包上传更加简单快速. fir.im Jenkins ...