阅读导航

问题

解决方案

工作原理

代码演示

在此解释一下,空气路由,是本人臆想出来,觉着更能表达 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. Wix 安装部署教程(十一) ---QuickWix

    这次发布的是这两天做的一个WIX工具QuickWIX,主要解决两个问题点1.对大文件快速生成wix标签(files,Directories,ComponentRef):2.比较前后两次工程的差异.大的 ...

  2. Unity3d使用经验总结 数据驱动篇

    我这里说的数据驱动,不是指某种框架,某种结构,或者某种编码方式. 我要说的,是一种开发方式. 大家都知道,U3D中,我们可以为某个对象编写一个脚本,然后将这个脚本挂在对象上,那这个对象就拥有了相应的能 ...

  3. 简化工作流程,10款必备的HTML5开发工具

    利用HTML5工具不仅可以帮助设计师和开发者创建更具吸引力的网站,还能增加网站的可用性和可访问性.本文收集了10款HTML5开发工具让你在网页中搭建特效.动画.视频.音频等诸多功能,为你节省更多开发时 ...

  4. jmx完整示例

    很早就开始去了解这个了,不过一直都是皮毛,基本概念明白,具体api几乎一无不知... 认真看了几篇文章,做了测试,终于有所了解 参考 入门级别: http://www.cnblogs.com/agou ...

  5. lua以xpcall实现try/catch功能

    -- 打印错误信息 local function __TRACKBACK__(errmsg) ); print("-------------------------------------- ...

  6. 批处理集锦——(5)使用dir查找文件

    eg dir /a-d /s /b *.bat -d表示不显示.bat结尾的文件夹

  7. 如何使用ITEXTSHARP将HTML代码字符串写进PDF

    原文 如何使用ITEXTSHARP将HTML代码字符串写进PDF itextsharp包括一个简单的类,可以用来根据html代码或字符串创建pdf文件.使用此类,你可以使用短短几行代码,就将 HTML ...

  8. IOS开发之控件篇UICollectionViewControllor第一章 - 普通介绍

    1.介绍 UICollectionView和UICollectionViewControllor是IOS6.0后引入的新控件 使用UICollectionView必须实现三个接口: UICollect ...

  9. 支持自动切换的tab标签代码札记

    html代码如下: <!-- tab标签代码begin --> <div class="tab1" id="tab1"> <div ...

  10. sql基础语句大杂烩

    (坑Open Office,这排版...) 1.distinct列出不同值,过滤掉相同的值 例:company中有两个相同的值比如(apple和apple)时,则只取出一个值 SELECT DISTI ...