問題

如果僅僅針對指定的路由進行某些特定的消息處理,而不是應用于所有路由,我們應該怎么做呢?

 

解決方案

ASP.NET WEB API 的很多功能都內(nèi)建了消息處理器。他們真正的威力是為消息的全局處理以及為全局的應用程序業(yè)務(wù)處理提供比較簡單的處理機制。不過,在某一些場景下的需求是,使用消息處理器處理應用程序指定部分的特定行為。

 

我們要基于每個路由配置消息處理器(DelegatingHandler),而不是在 HttpConfiguration 中注冊全局的。在 HttpRouteCollectionExtension 中有一個重載的 MapHttpRoute 方法 ,他是可以做到。

public static IHttpRoute(this HttpRouteCollection routes,string name,string routeTemplate,object defaults,object contraints,HttpMessageHandler handler)

 

注意 只能在集中式路由中使用,而不能在屬性路由中使用。

 

工作原理

在 Web API 管道中,基于路由的消息處理器是在全局消息處理器之后,HttpControllerDispatcher 之前執(zhí)行。一個叫做 HttpRouteDispatcher 的服務(wù)來負責識別給定路由是否指定了消息處理器。如果是的話,請求將交由處理器處理,否則,繼續(xù)處理,匹配 Controller。

 

指定路由處理器需要指定 InnerHandler 來繼續(xù)處理消息。我們必須添加一個指定路由處理器,或者,將請求交還給 HttpControllerDispatcher,如代碼片段 3-22 所示。使用這個技術(shù),只要在最后添加 HttpControllerDispatcher,在路由上可以有很多處理器,如果最后不添加 HttpControllerDispatcher 的話,就請求不到任何 Controller。

 

代碼片段 3-22.使用指定路由處理器


 

這個可以給開發(fā)者提供很多靈活性的東西,尤其是,基于身份認證相關(guān)的場景,只要在需要身份認證的路由中增加安全相關(guān)的處理器。

 

代碼演示

記錄路由 /api/[sometink] 的日志,而不需要記錄 /api/public/[something] 的。那么,我們需要消息處理器應用在指定的路由上,而不是在全局上處理所有的請求。

 

首先,我們做一個簡單的 API 請求日志記錄處理器,如代碼片段 3-23 所示。

代碼片段 3-23. 日志消息處理器,僅僅作用在指定的路由上。

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓


Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

 

在這里,我們沒有必要深究 Request/Response 日志的實際實現(xiàn)方式。為了完成代碼演示,我們只要將日志記錄到內(nèi)存中就可以。我們主要的關(guān)注點是在處理器作用在指定路由的機制。需要注意的是,要傳 ASP.NET WEB API HttpConfiguration 對象給處理器。如代碼片段 3-24 所示。

 

代碼片段 3-24. 常規(guī)路由的注冊與有處理器的注冊

Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓


Android培訓,安卓培訓,手機開發(fā)培訓,移動開發(fā)培訓,云培訓培訓

 

如果應用程序啟動的話,效果應該如下

  • 所有 /api/public/[something] 相關(guān)的請求不會被記錄 Request/Response 的日志。

  • 所有 /api/[something] 相關(guān)的請求會被記錄 Request/Response 的日志,這主要是因為,上面的配置只是對這樣的路由添加了處理器。