是否可以拥有一个.NET MVC应用程序,并且可以从不同的域访问它,以便内容依赖于域?
例如,www(点)site1(点)com和www(点)site2(点)com都将指向我的服务器的IP,并指向IIS中的同一网站。在那个网站上,我的.NET MVC应用程序将驻留。现在,我希望能够知道哪个站点(域名)触发了ControllerAction,并采取相应的行动(例如,在索引操作中显示主页的不同内容,或允许/阻止访问分配给特定站点的特定内容)
我将不胜感激任何帮助。我可以接受传递给所有控制器操作的额外参数(可能使用路由),但是如果有更优雅的解决方案是理想的。
答案 0 :(得分:2)
好吧,您始终可以从Request.RawUrl属性中获取域名。
正如Mercer所说,将这些部署为两个独立的网络应用程序将是一个更好的解决方案。如果那是不可能的,我会尝试设计一些相对通用的东西来检查域并为每个域返回不同的视图。
答案 1 :(得分:1)
您可以使用以下内容轻松访问请求中使用的域名:
switch(Request.ServerVariables("SERVER_NAME"))
{
case "www.site1.com":
//do something
case "www.site2.com":
//do something else
default:
//????
}
您可以在有权访问Request对象的任何地方执行此操作。
答案 2 :(得分:1)
我已经编写了一个blog post,关于如何使用示例Web应用程序进行下载。
它使用一个抽象的基础控制器,它知道要调用的站点 - 通过创建从该基类继承的控制器,您可以自动访问当前请求的当前“站点”。
它还允许您从单个数据库加载所有站点 - 如果您在共享主机上,可以节省一些托管费用,或者如果您运行自己的服务器,则无需设置您创建的每个站点的新数据库。
答案 3 :(得分:0)
一个优雅的解决方案是为2个域进行2次部署,并分离内容。
你仍然可以拥有共同的内容,但是在没有在应用程序内部对其进行硬编码的情况下分离内容是一种胜利。
答案 4 :(得分:0)
如果使用不同的数据库将数据分开,则在“会话开始”中将应用程序配置为使用基于“服务器名称”变量的其中一个数据库。然后将工作连接字符串放在用户的会话中。
protected void Session_Start(Object sender, EventArgs e)
{
NameValueCollection NVCSrvElements = Request.ServerVariables;
switch (NVCSrvElements.Get("SERVER_NAME"))
{
case "www.whatever1.com":
Session["ConnStr"]="db1 connection string";
break;
case "www.whatever2.com":
Session["ConnStr"] = "db2 connection string";
break;
}
}
然后在应用程序的其余部分使用此连接字符串。