2009-07-09 69 views
2

是否有可能擁有一個.NET MVC應用程序,並讓它可以從不同的域訪問,以這種方式內容將取決於域?不同的網站在不同的領域,一個.NET MVC應用程序?

例如,www(dot)site1(dot)com和www(dot)site2(dot)com將指向我的服務器的IP,並指向IIS中的同一網站。在那個網站我的.NET MVC應用程序將駐留。現在,我希望能夠知道哪個站點(域名)觸發了ControllerAction,並相應地採取行動(例如,在Index操作中顯示主頁的不同內容,或者允許/阻止訪問分配給特定站點的特定內容) 。

我將不勝感激任何幫助。我可以接受一個傳遞給所有控制器動作的額外參數(可能使用路由),但是如果有更理想的解決方案的話。

+0

舉報!你最終做了什麼以及它是如何工作的?謝謝! – 2010-12-17 09:00:40

回答

1

我寫了一個blog post關於如何使用示例Web應用程序進行下載。

它使用一個抽象的基礎控制器知道它被調用的站點 - 通過創建從這個基類繼承的控制器,你可以自動訪問當前請求的當前「站點」。

它還允許您從單個數據庫加載所有網站 - 如果您在共享主機上,或者如果您運行自己的服務器,則無需設置即可節省主機費用爲您創建的每個網站創建一個新數據庫。

0

一個優雅的解決方案是對2個域進行2次部署並分離內容。

你仍然可以擁有共同的內容,但是在應用程序內部沒有對其內容進行硬編碼的情況下分離內容是一種雙贏的局面。

2

那麼,你總是可以從Request.RawUrl屬性獲取域。

正如Mercer所說,將這些部署爲兩個獨立的Web應用程序將是一個更好的解決方案。如果這是不可能的,我會嘗試設計一些相對通用的東西來檢查域併爲每個域返回不同的視圖。

+1

整個想法是保持它乾燥(=不要重複你自己的原則)。我想要安裝一個應用程序,所以無論何時需要更新應用程序,我都只需要部署一次,並讓所有依賴它的網站「自動」更新。 內容分離將使用FK在數據庫中完成,或者在不同的DB中完成(可由應用程序在XML文件中配置)。MVC應用程序的內容是通用的東西在這裏... 問題是如何最好地實現這一目標? – synhershko 2009-07-09 14:47:31

+1

@synhershko - 如果是這樣的話,爲什麼不把你的控制器和模型放在一個由兩個web應用程序共享的單獨的類庫項目中?然後每個Web應用程序都會擁有自己的視圖。您仍然有兩個部署,但只有一個代碼庫。我最擔心的是,如果網站的功能開始分化太多,可能會導致一些混亂的代碼。很難說如果這對你來說真的是一個問題,雖然不知道更多關於你的應用程序。 – 2009-07-09 15:20:11

+0

我已經有了大部分的代碼(你可以稱之爲模型和其他輔助材料)在一個單獨的類庫中。這些控制器不那麼通用,視圖也是如此。我希望只保留一次安裝的主要原因之一是避免每次更新都需要更新多個安裝 - 並且將會有超過2個站點和頻繁更新。兩種方式我將有一個代碼庫,不同的是我想避免多個安裝和發佈位置。 – synhershko 2009-07-09 15:31:40

1

您可以輕鬆地訪問請求大致如下的線路上使用的東西域名:

switch(Request.ServerVariables("SERVER_NAME")) 
{ 
    case "www.site1.com": 
     //do something 
    case "www.site2.com": 
     //do something else 
    default: 
     //???? 
} 

你可以做到這一點的任何地方,你可以訪問Request對象。

0

如果您使用不同的數據庫來保持數據分離,那麼在Session Start中將應用程序配置爲使用基於Server Name變量的數據庫之一。然後將工作連接字符串放在用戶的會話中。

protected void Session_Start(Object sender, EventArgs e) 
{ 
    NameValueCollection NVCSrvElements = Request.ServerVariables; 
    switch (NVCSrvElements.Get("SERVER_NAME")) 
    { 
     case "www.whatever1.com": 
      Session["ConnStr"]="db1 connection string"; 
      break; 
     case "www.whatever2.com": 
      Session["ConnStr"] = "db2 connection string"; 
      break; 
    }     
} 

然後在應用程序的其餘部分使用此連接字符串。