2009-05-26 40 views
2

我需要爲MVC實現一個自定義處理程序,該處理程序首先查看URL請求,以確定在將URL提交到路由引擎之前是否應該重寫URL。任何模式都是重定向的候選對象,所以我需要在標準MVC路由引擎查看之前攔截URL請求。如何在處理潛在覆蓋後推遲到ASP.NET MVC的「默認」HttpHandler?

在看了一大堆實現ASP.NET MVC自定義路由的例子,博客,文章等之後,我仍然沒有找到適合我的場景的用例。我們有一個適用於ASP.NET的現有實現,可以正常工作,但當沒有重寫匹配時,我們將返回「標準」處理程序。我們目前使用的技術與此MSDN文章中描述的非常相似:http://msdn.microsoft.com/en-us/library/ms972974.aspx#urlrewriting_topic5其中說「HTTP處理程序工廠可以返回由System.Web.UI.PageParser類的GetCompiledPageInstance()方法返回的HTTP處理程序(這是與內置ASP.NET Web頁面HTTP處理程序工廠PageHandlerFactory工作相同的技術。「)。

我想弄清楚的是:如何獲得第一次看到傳入的請求,然後將它傳遞給MVC路由,如果當前請求不匹配任何動態配置的(通過數據表)值?

回答

2

你將需要:

  1. 不使用標準的圖路線擴展方法在Global.asax中(這是建立在路由處理)。
  2. 而是編寫自己的路線子類型like this
+1

非常感謝Craig。我沒有在我所做的所有搜索中找到這篇文章。當與我的團隊討論這個問題時,我們認爲我們應該長期青睞新的url模式,並保持最佳性能,並將遺留網址重定向爲退步,在返回之前我們可以測試模式匹配404錯誤。 但是,您鏈接到的博客仍然可以用於其他一些場景。 – 2009-05-26 17:30:12

1

儘管我向克雷格解釋過,我可能不需要重寫場景(有利於未來,而不是過去),但我意識到有一個簡單且合理的乾淨的地方可以實現此重寫 - 默認情況下。 aspx代碼隱藏在文件後面。下面是標準的Page_Load方法:

public void Page_Load(object sender, System.EventArgs e) 
    { 
     // Change the current path so that the Routing handler can correctly interpret 
     // the request, then restore the original path so that the OutputCache module 
     // can correctly process the response (if caching is enabled). 

     string originalPath = Request.Path; 
     HttpContext.Current.RewritePath(Request.ApplicationPath, false); 
     IHttpHandler httpHandler = new MvcHttpHandler(); 
     httpHandler.ProcessRequest(HttpContext.Current); 
     HttpContext.Current.RewritePath(originalPath, false); 
    } 

正如你所看到的,那將是非常容易的MVC處理的前堅持一個URL處理的攔截器。這改變了標準的默認頁面行爲,並且需要反映在你想用同樣的方法創建的任何其他MVC應用程序中,但它確實看起來像會起作用。

+0

我不認爲這是用於所有請求。請參閱aspx中的評論。不過你可以重寫Controller.HandleUnknownAction。 – 2009-05-26 20:24:54