【问题标题】:Different websites on different domains, one .NET MVC application?不同域上的不同网站,一个 .NET MVC 应用程序?
【发布时间】:2010-11-09 09:48:08
【问题描述】:

是否有可能拥有一个 .NET MVC 应用程序,并且可以从不同的域访问它,从而使内容依赖于域?

例如,www(dot)site1(dot)com 和 www(dot)site2(dot)com 都将指向我服务器的 IP,并指向 IIS 中的同一个网站。我的 .NET MVC 应用程序将驻留在该网站中。现在,我希望能够知道哪个站点(域名)触发了 ControllerAction,并采取相应措施(例如,在 Index 操作中为主页显示不同的内容,或允许/阻止访问分配给特定站点的特定内容) .

我将不胜感激这方面的任何帮助。我可以接受传递给所有控制器操作的额外参数(可能使用路由),但如果有更优雅的解决方案将是理想的。

【问题讨论】:

  • 报告!?你最终做了什么,结果如何?谢谢!

标签: c# asp.net asp.net-mvc asp.net-mvc-routing


【解决方案1】:

一个优雅的解决方案是为 2 个域进行 2 次部署,并分离内容。

您仍然可以拥有共同的内容,但在应用程序内部不进行硬编码的情况下分离内容是一个双赢的局面。

【讨论】:

    【解决方案2】:

    嗯,您总是可以从 Request.RawUrl 属性中获取域。

    正如 Mercer 所提到的,将它们部署为两个独立的 Web 应用程序将是一个更好的解决方案。如果这不可能,我会尝试设计一些相对通用的东西来检查域并为每个域返回不同的视图。

    【讨论】:

    • 整个想法是保持干燥(= 不要重复自己的原则)。我想安装一个应用程序,所以每当需要更新应用程序时,我只需部署一次,并让所有依赖它的网站“自动”更新。内容分离将使用 FK 在数据库中完成,或者在不同的 DB 中完成(可以由应用程序在 XML 文件中配置)。用于传递内容的 MVC 应用程序在这里是通用的东西......问题是如何最好地实现这一点?
    • @synhershko - 如果是这样,为什么不将控制器和模型放在两个 Web 应用程序共享的单独类库项目中?然后每个 Web 应用程序都会有自己的视图。您仍然有两个部署,但只有一个代码库。我最大的担忧是,如果网站的功能开始出现太多分歧,可能会导致一些混乱的代码。很难说这对您来说是否真的是一个问题,尽管您不了解您的应用程序的更多信息。
    • 我已经在一个单独的类库中拥有了大部分代码(你称之为模型和其他辅助的东西)。控制器不太通用,视图也是如此。我只想保留一个安装的主要原因之一是避免每次更新都需要更新多个安装 - 并且将有超过 2 个站点,并且更新非常频繁。两种方式我都将拥有一个代码库,不同之处在于我想避免多次安装和发布位置。
    • 作为一个场景 - 考虑一个带有内容页面和菜单的简单站点(我的情况更复杂,但现在就足够了)。我想避免维护多个包含应用程序的文件夹;我想在服务器上拥有一个代码库和一个文件夹,我会将编译后的应用程序发布到其中。该应用程序将足够智能,可以检测用于访问它的域,并显示与该站点相关的内容(使用从 XML 加载的静态地图或类似的地图)。这更有意义吗?
    【解决方案3】:

    您可以通过以下方式轻松访问请求中使用的域名:

    switch(Request.ServerVariables("SERVER_NAME"))
    {
        case "www.site1.com":
            //do something
        case "www.site2.com":
            //do something else
        default:
            //????
    }
    

    您可以在任何可以访问 Request 对象的地方执行此操作。

    【讨论】:

    • 谢谢,我已经知道了,但是我想在哪里使用它来定位站点 ID 并将其传递给控制器​​操作?或者更好的是,有没有一种更流畅的方式来做到这一点而无需控制器动作有额外的参数?
    【解决方案4】:

    如果您使用不同的数据库来保持数据分离,则在会话启动中配置应用程序以使用基于服务器名称变量的数据库之一。然后将工作连接字符串放入用户的会话中。

    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;
      }                  
    }
    

    然后在应用程序的其余部分使用此连接字符串。

    【讨论】:

      【解决方案5】:

      我已经写了一个blog post,关于如何通过一个示例网络应用程序下载来做到这一点。

      它使用一个抽象的基础控制器,它知道它被调用的站点 - 通过创建从这个基类继承的控制器,您可以自动访问当前请求的当前“站点”。

      它还允许您从单个数据库加载所有网站 - 如果您在共享主机上,或者如果您运行自己的服务器,则可以节省一些托管费用,您无需设置为您创建的每个站点创建新数据库。

      【讨论】:

      • 谢谢,这看起来像我一直在寻找的。我可能需要稍微调整一下,但这是朝着正确的方向发展。谢谢!
      • 您的博文链接已损坏
      猜你喜欢
      • 1970-01-01
      • 2014-11-08
      • 1970-01-01
      • 2019-11-05
      • 1970-01-01
      • 1970-01-01
      • 2012-05-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多