2012-02-24 55 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; } 
    } 

这是一种有趣的系统,很可能会在许多不同的方式做了。它建立了一段时间,它很好。