【发布时间】:2014-11-17 12:39:57
【问题描述】:
我有一个使用多个子域运行的 ASP.net MVC (5.2) 站点,其中子域的名称是我数据库中客户端的名称。基本上我想要做的是在我的操作方法中使用子域作为变量,以允许我从我的数据库中获取正确的数据。
几年前我做过类似的事情,但它很混乱而且不直观,所以想知道是否有比我以前使用的更好的方法来做到这一点。这是我之前做的:
protected override void OnActionExecuting(ActionExecutingContext filterContext) {
Session["subdomain"] = GetSubDomain(Request.Url);
}
private static string GetSubDomain(Uri url) {
string host = url.Host;
if (host.Split('.').Length > 1) {
int index = host.IndexOf(".");
string subdomain = host.Substring(0, index);
if (subdomain != "www") {
return subdomain;
}
}
return null;
}
如果子域不是“www”,这基本上为会话变量分配了一个键,但我真的不喜欢这种方式,因为它依赖于我知道会话可能包含这个神奇的值!
理想情况下,我希望能够创建一个属性,我可以使用该属性来装饰我的类/方法,该属性将提取子域,然后允许我在我的操作方法中包含一个“子域”参数,该参数将包含提取的值由属性。这可能吗?
如果做不到,有没有更好的方法来做我现在正在做的事情,而不必依赖会话?
谢谢,
迪伦
【问题讨论】:
-
客户端肯定需要登录?那时加载名称不是更容易吗?
-
我在发布后立即意识到我可以在控制器中创建一个私有变量,并让 OnACtionExecuting 方法写入该变量而不是会话,但这仍然意味着必须在每个页面中包含逻辑,所以我仍然在追求一种不会让我重复代码的更干净的方法。
-
我认为
Session是存储值的正确位置,但是,我认为您从 per request 的 URL 中提取它的想法是错误的。就像我说的,客户端必须在某个时间点登录,因此必须与客户端和名称相关联 - 成功登录后,我只需在Session中设置名称。 -
不,这是针对基于客户数据的面向公众的网站,因此无需登录。基本上每个客户在数据库中都会有不同的数据,并且在面向公众的网站上显示的页面将需要根据正在使用的子域使用不同的数据。我基本上创建了一个站点,该站点为来自同一代码库的多个不同站点提供服务,而子域是唯一用于区分它们的东西。
-
好吧(类似于 stackexchange :))。
标签: c# asp.net asp.net-mvc