首先如果您需要在項目中使用在ASPNET Routing的功能則需要在nfig文件中配置一個HttpModule
<add name=
UrlRoutingModule
type=
System
Web
Routing
UrlRoutingModule
System
Web
Routing>
其次您應該在Application_Start中向RouteCollection類型的RouteTableRoutes集合中添加一系列RouteBase對象並為每個RouteBase對象指定一個獨立的名稱(大小寫無關)當然您也可以在運行時動態添加或刪除 內容(RouteCollection對象是線程安全的)只不過我們平時不太會去這麼做而已值得注意的是RouteCollections裡的RouteBase對象它們的順序是非常重要的
UrlRouteModule會監聽ASPNET Request Pipelines的PostResolveRequestCache事件在這個事件中UrlRouteModule會將當前的HttpContext作為參數調用RouteTableRoutes集合的GetRouteData方法在RouteCollection的GetRouteData方法中又會依次將HttpContext傳入每一個RouteBase對象的GetRouteData方法如果中途某個RouteBase對象返回了一個非null的結果則這個結果便會直接返回給UrlRouteModule
如果UrlRouteModule調用RouteTableRoutesGetRouteData方法得到了null則一切都像沒有發生過如果GetRouteData方法得到了結果——一個RouteData對象此時RouteDataValues便會包含請求中捕獲到的數據RouteData中另一個重要的成員便是RouteDataRouteHandler屬性它返回一個IRouteHandler對象IRouteHandler接口中只有一個方法GetHttpHandler它接受RequestContext作為參數並返回一個IHttpHandler對象如ASPNET MVC框架在利用ASPNET Routing時便會使用MvcRouteHandler來返回一個MvcHandler對象
不過UrlRouteModule在得到了IRouteHandler對象之後並不會直接調用其GetHttpHandler方法而是判斷它是不是ASPNET Routing自帶的StopRoutingHandler類型StopRoutingHandler是個特殊的IRouteHandler對象它的作用只是告訴UrlRouteModule雖然某個規則匹配成功了但是——也還是當什麼都沒發生過吧因此如果我們想要跳過一些形式的請求往往則需要將忽略功能放在其他所有規則之前如
public static void RegisterRoutes(RouteCollection routes)
{
routes
IgnoreRoute(
{resource}
axd/{*pathInfo}
);
routes
IgnoreRoute(
scripts/{*pathInfo}
);
routes
IgnoreRoute(
images/{*pathInfo}
);
routes
MapRoute(
Default
// Route name
{controller}/{action}/{id}
// URL with parameters
new { controller =
Home
action =
Index
id =
} // Parameter defaults
);
}
IgnoreRoute是定義在ASPNET MVC中基於RouteCollection類型的擴展方法它會向RouteCollection中添加一個Route對象而這個Route對象在匹配成功時返回的RouteData對象其RouteHandler屬性便為一個StopRoutingHandler於是余下的Routing規則也不會繼續匹配了——這一點和RouteBase對象返回null不同因為如果返回null則余下的規則還會依次匹配如果返回了一個包含StopRoutingHander的RouteData則剩下的Routing規則全部跳過
如果UrlRouteModule得到的IRouteHandler對象不是StopRoutingHandler則便會通過其GetHttpHandler方法獲得那個IHttpHandler對象這個IHttpHandler對象會被放入HttpContext的Items集合中至此Request Pipeline的PostResolveRequestCache事件便結束了
UrlRouteModule還會監聽PostMapRequest事件此時Module便會查找HttpContextItems集合的特定位置中是否包含一個IHttpHandler對象如果存在則會將這個對象設為當前HttpContext對象的Handler屬性的值於是當ASPNET繼續執行下去時便會調用這個Handler的ProcessRequest方法來處理請求了
如果這個IHttpHandler對象是MvcHttpHandler那麼它便會從RouteData中獲取一些數據構造Controller對象執行Action等等如果它是一個DynamicDataHandler或是WebForm的HttpHandler那麼剩下的便是各自的模型的處理方式了
因此ASPNET Routing是一個通用的組件它不涉及到任何具體的請求處理方式如果您需要也可以自己基於它進行開發——如FubuMvc項目就是這麼做的
From:http://tw.wingwit.com/Article/program/net/201311/12848.html