ASP.NET MVC。数据驱动的子域名?

时间:2011-11-09 09:59:02

标签: c# asp.net-mvc

我们正在创建一个多租户网络应用程序,我们通过子域(customer1.ourapp.com,customer2.ourapp.com等)识别租户。

子域的设置必须是数据驱动的 - 即我们不希望每次获得新客户时都必须(手动或以编程方式)修改IIS配置。

在MVC中,检查请求中的子域是否有效的最佳位置(即子域存在于数据库的某个表中)

我考虑过的一些选项,

  1. 控制器中的OnActionExecuting
  2. 在自定义操作过滤器
  3. IIS模块
  4. 作为路由设置的一部分 - 了解有效子域的自定义路由类 - 与此方法类似 - http://blog.maartenballiauw.be/post/2009/05/20/ASPNET-MVC-Domain-Routing.aspx
  5. 我认为从概念上讲这是一个路由任务,所以最后一个选项似乎正确?即,具有不存在的子域的请求本质上是一个无效的URL,因此它不应与路由匹配,而应该转到404.这也允许我们明确定义需要或不需要的路由一个有效的子域名。

2 个答案:

答案 0 :(得分:2)

我会创建一个自定义操作过滤器并在Global.asax中全局注册它(添加新控制器时无需担心)。

您还可以考虑创建自定义MvcHandler并在声明路由时指定它。这将允许您指定一些路由(即静态内容),可以在所有客户端之间共享。

其他解决方案是仅使用路由并坚持使用单个域,因此您不必为野外卡域支付昂贵的SSL证书。

答案 1 :(得分:2)

我以前在我的基本控制器类中这样做,但是,就像@Jakub所说的那样,如果您或您的客户在此后需要SSL证书,使用子域将会很昂贵。

            var dotIndex = HostingEnvironment.SiteName.IndexOf('.');
            if (dotIndex > 0)
            {
                var subdomain = HostingEnvironment.SiteName.Substring(0, dotIndex);
                customerCode = subdomain;
            }