我有一个用ASP.NET编写的网站。 我想添加各州的子域名。比如nevada.mysite.com。 但是,我希望我的整个网站都是为该子域定制的。 也就是说,我想在每个页面中捕获我所在的子域上下文并显示不同的内容。
我不想分开到不同的网站。我希望他们都驻留在IIS中的同一个网站
处理此类问题的最佳方法是什么? 你建议在哪里持有并保存国家的全局变量?
谢谢!
答案 0 :(得分:1)
首先,让所有子域指向DNS中的单个IP地址。
接下来,配置IIS以侦听该IP上的所有连接(不指定主机名)
然后使用HttpModule
事件的处理程序编写BeginRequest
(或者可能使用Global.asax)。从传入的网址中提取子域名,并将其存储在HttpContext.Items["state"]
中(Items
Dictionary
每个请求都是唯一的。)
答案 1 :(得分: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 to 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; }
}
这是一个有趣的系统,可能可以通过许多不同的方式完成它。很久以前就已经建成了它,效果很好。