阅读导航

问题

解决方案

工作原理

代码演示

在此解释一下,空气路由,是本人臆想出来,觉着更能表达 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. Linux 对比两个文本的交集和差集(comm)

    200 ? "200px" : this.width)!important;} --> 介绍 comm命令可以对两个已排序好的文本的内容进行交集和差集的对比,记住必须是已排序 ...

  2. js模版引擎handlebars.js实用教程——with-终极this应用

    返回目录 <!DOCTYPE html> <html> <head> <META http-equiv=Content-Type content=" ...

  3. 由ASP.NET所谓前台调用后台、后台调用前台想到HTTP——实践篇(二)

    在由ASP.NET所谓前台调用后台.后台调用前台想到HTTP——理论篇中描述了一下ASP.NET新手的三个问题及相关的HTTP协议内容,在由ASP.NET所谓前台调用后台.后台调用前台想到HTTP—— ...

  4. C++ inline函数

    本文主要记录了C++中的inline函数,也就是内联函数,主要记录了以下几个问题: C++为什么引入inline函数? 为什么inline能很好的取代表达式形式的预定义? inline函数的使用场合 ...

  5. .NetCore~框架版本号不同引起dotnet不能run它

    对于.netCore来说,今年已经推出了正式版,这要求使用vs2015的开发者需要升级到beta3版,而如果使用老版VS开始的.netCore应用程序,它的架构版本将为是测试版"versio ...

  6. lua二进制操作函数

    由于 Lua 脚本语言本身不支持对数字的二进制操作(例如 与,或,非 等操作),MUSHclient 为此提供了一套专门用于二进制操作的函数,它们都定义在一个“bit”表中,使用时只要requre “ ...

  7. Atitit js中的依赖注入di ioc的实现

    Atitit js中的依赖注入di ioc的实现 全类名(FQCN)为标识符1 混合请求模式1 使用类内  builder  即可..2 Service locator method走ok拦2 Jav ...

  8. atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性

    atitit.Servlet2.5 Servlet 3.0 新特性 jsp2.0 jsp2.1 jsp2.2新特性   1.1. Servlet和JSP规范版本对应关系:1 1.2. Servlet2 ...

  9. salesforce 零基础学习(二十二)Test简单使用

    本篇内容只是本人简单的mark开发中常出现的一些疑问,方便后期项目使用时奠定基础,如果对Test零基础童鞋,欢迎查看Test官方的使用介绍: https://help.salesforce.com/a ...

  10. 两套JRE

    JDK就是Java Development Kit.简单的说JDK是面向开发人员使用的SDK,它提供了Java的开发环境和运行环境. SDK是Software Development Kit 一般指软 ...