0

我有一個ASP.NET MVC應用程序有以下部署要求:高級ASP.NET MVC路由方案

的URL結構必須是這樣的:

http://server/app/[enterprise]/[communinty]/ {控制器}/{行動} /。 ..

我想我能做的是在MVC路由處理程序獲得它之前攔截URL,刪除[enterprise]/[community]部分,然後允許MVC繼續處理如果原始網址未包含這兩個細分受衆羣。

這裏的原因:

申請公開多個門戶向多個客戶(企業),以及企業內的每個社區都有自己的用戶羣。這種方案也可以通過將一個應用程序實例(二進制文件,內容,web.config)物理地部署到每個[社區]目錄中來實現,但出於後勤和性能的原因,我認爲我們不想走這條路。所以我試圖通過路由技巧來虛擬化它。

任何有關如何去實施這個計劃或備用解決方案的建議將不勝感激。

我們在IIS 7上,如果這有什麼區別。

+0

因此,人們訪問'http:// server/app/MyCompany/FightingDogs/Home/Index',然後您想提取MyCompany/FightingDogs,以便URL現在讀取'http:// server/app/Home/Index '? (我想你在會話或cookie中存儲對MyCompany/Fightingdocs的引用?) – jao 2010-07-23 20:43:12

+0

不完全。我希望瀏覽器可見的URL保持爲http:// server/app/MyCompany/FightingDogs/Home/Index,但我不希望MVC控制器/模型/等必須知道「MyCompany/FightingDogs」部分。 – jlew 2010-07-23 20:49:24

+0

不使用路由會更有意義,而是在登錄時將當前用戶的企業和社區存儲在會話中?我可以想象,如果它們對於每個用戶羣都是唯一的,那麼很難在文檔中包含URL。 – Ryan 2010-07-24 04:07:07

回答

1

您可以使用下面的路由默認路由

routes.MapRoute(
    null, 
    "{enterprise}/{community}/{controller}/{action}/{id}", 
    new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
); 

之前,則可以忽略{企業}和{}社區參數動作方法。

+0

你知道嗎,我曾經認爲不可能「忽略」這些元素(視圖模型需要包含它們),但看起來你是對的。謝謝! – jlew 2010-07-27 13:41:34

0

以下是使用IIS Rewrite模塊的可能解決方案。這可能不是最好的方法,但它可能有效。 MVC路由中有更簡單/更好的選項嗎?不確定。只是自己開始做這件事。

以「http://server.com/app/enterprise/community/controller/action/」爲例。

會發生什麼:

  1. 條上的串出的URL。新 URL: http://server.com/controller/action/
  2. 重定向用戶到新的URL。用戶 瀏覽器現在顯示: http://server.com/controller/action/
  3. 注意到新的URL,並試圖重建 它抓住了正確的 內容。用戶瀏覽器顯示: http://server.com/controller/action/; IIS回報: http://server.com/app/enterprise/community/controller/action/

一旦安裝了IIS重寫模塊所有這一切都將在web.config中:

<rewrite> 
    <rules> 
     <clear /> 

     <rule name="Redirect to remove Offending String" enabled="true" patternSyntax="Wildcard" stopProcessing="true"> 
      <match url="server.com/app/enterprise/community*" /> 
      <action type="Redirect" url="/{R:1}" /> 
      <conditions logicalGrouping="MatchAll"> 
       <add input="{SERVER_NAME}" pattern="*server.com*" /> 
      </conditions> 
     </rule> 

     <rule name="Rewrite to get Original Content" enabled="true" patternSyntax="Wildcard" stopProcessing="false"> 
      <match url="*" /> 
      <conditions logicalGrouping="MatchAll"> 
       <add input="{SERVER_NAME}" pattern="*server.com*" /> 
      </conditions> 
      <action type="Rewrite" url="app/enterprise/community{R:1}" /> 
     </rule> 

    </rules> 
</rewrite> 

注:只是做這個快速,沒有測試。

+0

他使用mvc,內置了路由(如果你不知道) – jao 2010-07-23 20:44:53

+0

我意識到MVC內置了路由,但是從我認爲jlew想要的內容中讀取並認爲MVC路由可能無法做到這一點。 但是,在閱讀jlew的新評論之後,我的方法將無法滿足他的需求,它直接處理MVC路由。 – mcnarya 2010-07-23 21:06:51