閱讀導航
問題
如果僅僅針對指定的路由進行某些特定的消息處理,而不是應用于所有路由,我們應該怎么做呢?
解決方案
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 的日志,這主要是因為,上面的配置只是對這樣的路由添加了處理器。
文章列表