阅读导航

问题

解决方案

工作原理

代码演示

在此解释一下,空气路由,是本人臆想出来,觉着更能表达 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. TW2015技术雷达中文版发布

    今天thoughtworks 2015新版技术雷达pdf发布了,你可以从这里下载http://engage.thoughtworks.com/HQ0000Q0QOf5pE70nbD00GP,在这里你可 ...

  2. [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门

    [.net 面向对象程序设计进阶] (6) Lamda表达式(二) 表达式树快速入门 本节导读: 认识表达式树(Expression Tree),学习使用Lambda创建表达式树,解析表达式树. 学习 ...

  3. UDP Client—Linux

    #include <stdio.h> #include <netinet/ip.h> int main(int argc,char *argv[]) { #define PER ...

  4. [蓝牙] 5、Battery Service module

    Detailed Description This module implements the Battery Service with the Battery Level characteristi ...

  5. 人机大战之AlphaGo的硬件配置和算法研究

    AlphaGo的硬件配置 最近AlphaGo与李世石的比赛如火如荼,关于第四盘李世石神之一手不在我们的讨论范围之内.我们重点讨论下AlphaGo的硬件配置: AlphaGo有多个版本,其中最强的是分布 ...

  6. nanoTime对volatile 测试的一种写法

    今天脑筋有点搭牢,想了半天才看出为什么以下两段代码效果是相同的... 第一种好处是可以直接批量复制黏贴system.out,  不用改什么东西 private static long i;  priv ...

  7. windows批处理总结

    rem echo off 表示之后所有命令行不显示,但命令结果总是会显示的!! 不存在%ROOT_DIR% . %CUR_DIR%的变量 rem @表示命令行不显示当前行,但命令结果总是会显示的!! ...

  8. iOS---用LLDB调试,让移动开发更简单(一)

    因文章字数超过限制,所以拆分成了上下篇 LLDB的Xcode默认的调试器,它与LLVM编译器一起,带给我们更丰富的流程控制和数据检测的调试功能.平时用Xcode运行程序,实际走的都是LLDB.熟练使用 ...

  9. java更改数据库中的数据

    不废话,上代码 package com.ningmeng; import java.sql.*; /** * 1:更改数据库中的数据 * @author biexiansheng * */ publi ...

  10. mybatis插入的同时获取主键id

    <insert id="insertAndReturnId" parameterType="com.qianlong.cms.entity.AppCmsRole&q ...