2012-02-24 82 views
0

我有一個用ASP.NET編寫的網站。 我想添加狀態的子域。如nevada.mysite.com。 但是,我想我的整個網站是爲該子域定製的。 也就是說,我想在每個頁面中捕獲哪些子域上下文,並顯示不同的內容。根據子域更改網站

我不想分開到不同的網站。我希望他們全部駐留在IIS中的同一網站中。處理此類問題的最佳方法是什麼? 你在哪裏建議保存並保存該狀態的全局變量?

謝謝!

回答

1

首先,讓所有的子域指向DNS中的單個IP地址。

接下來,配置IIS偵聽該IP的所有連接(不指定主機名)

然後一個HttpModule(或者使用Global.asax中)與該BeginRequest事件的處理程序編寫。從傳入的URL中提取子域名,並將其存儲在HttpContext.Items["state"](對於每個請求,ItemsDictionary是唯一的)。

1

這是一個很好的問題。我之前做過這個,除了我沒有使用子域,我使用了不同的URL,但他們仍然使用相同的代碼和數據庫。我想要一種方法將這一點與我的LINQ to SQL代碼更緊密地結合在一起,而不必輸入每個條款中的where子句。下面是我所做的:

public static IEnumerable<T> GetDataByDomain<T>(
     IQueryable<T> src) where T:IDbColumn 
    { 
     //1 == website1 
     //2 == website2 
     //3 == both 

     string url = HttpContext.Current.Request.Url.Host; 
     int i = url == "localhost" 
      || url == "website1.com" 
      || url == "www.website1.com" ? 1 : 2; 

     return src.Where(x => x.domainID == i|| x.domainID == 3); 
    } 

基本上與LINQ查詢表時,SQL我有我自己的自定義where子句。

使用像這樣:

using (var db = new MyDataContext()) 
     { 
      var items = Utility.GetDataByDomain(db.GetTable<Item>()).Where(x => x.isVisible); 
     } 
在每個表中,其中我有需要的一個網站中指定數據

最後或兩者予補充說注意到1,2或3的值的柱(二者)。此外,在我的LINQ數據方面,我做了一個局部類,並引用我的接口:

public partial class Item : Utility.IDbColumn 
{ 

} 

我們需要下面的接口是因爲第一種方法需要一個未知類型所以很明顯我無法從選擇一個屬性的原因未知的類型,除非我告訴它,我傳遞給它的任何類型都依賴於包含該屬性的接口。

接口:

public interface IDbColumn 
    { 
     int domainID { get; set; } 
    } 

這是一種有趣的系統,很可能會在許多不同的方式做了。它建立了一段時間,它很好。