【发布时间】:2012-02-24 07:32:09
【问题描述】:
我有一个用 ASP.NET 编写的网站。 我想添加状态的子域。例如 nevada.mysite.com。 但是,我希望我的整个网站都是为该子域定制的。 也就是说,我想在每个页面中捕获我所在的子域上下文并显示不同的内容。
我不想分开到不同的网站。我希望他们都驻留在 IIS 中的同一个网站中
处理此类问题的最佳和正确方法是什么? 你建议在哪里保存和保存状态的全局变量?
谢谢!
【问题讨论】:
我有一个用 ASP.NET 编写的网站。 我想添加状态的子域。例如 nevada.mysite.com。 但是,我希望我的整个网站都是为该子域定制的。 也就是说,我想在每个页面中捕获我所在的子域上下文并显示不同的内容。
我不想分开到不同的网站。我希望他们都驻留在 IIS 中的同一个网站中
处理此类问题的最佳和正确方法是什么? 你建议在哪里保存和保存状态的全局变量?
谢谢!
【问题讨论】:
首先,让您的所有子域都指向 DNS 中的一个 IP 地址。
接下来,配置 IIS 以侦听该 IP 上的所有连接(不要指定主机名)
然后为BeginRequest 事件编写一个带有处理程序的HttpModule(或者可能使用Global.asax)。从传入的 URL 中提取子域名,并将其存储在 HttpContext.Items["state"] 中(Items Dictionary 对于每个请求都是唯一的)。
【讨论】:
这是一个很好的问题。我以前做过这个,除了我没有使用子域,我使用了不同的 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; }
}
这是一个有趣的系统,可能可以通过多种不同的方式来实现。不久前构建的,效果很好。
【讨论】: