English 中文(简体)
ASP.NET中基于帐户的查找
原标题:
  • 时间:2008-12-09 16:59:22
  •  标签:

我正在考虑为一项新的SaaS服务使用ASP.NET,但是无论如何我似乎无法弄清楚如何基于子域名进行帐户查找,就像大多数SaaS应用程序(例如37Signals)所做的那样。

例如,如果我提供yourname.mysite.com,那么我应该如何使用ASP.NET(特别是MVC)提取子域,以便我可以加载正确的模板(显示您公司的名称等)? 可以通过常规路由完成吗?

这似乎是SaaS中常见的事情,因此在ASP.NET中一定有一种简单的方法来完成它;我知道有一些像Ruby on Rails这样的其他框架中的插件可以完成它。

最佳回答

这对我有效。

    //--------------------------------------------------------------------------------------------------------------------------
    public string GetSubDomain()
    {
        string SubDomain = "";

        if (Request.Url.HostNameType == UriHostNameType.Dns)
            SubDomain = Regex.Replace(Request.Url.Host, "((.*)(\..*){2})|(.*)", "$2");
        if (SubDomain.Length == 0)
            SubDomain = "www";
        return SubDomain;
    }

我假设你想在同一个Web应用程序中处理多个帐户,而不是使用IIS中的工具构建单独的站点。在我们的工作中,我们开始为每个子域创建一个新的网站,但发现这种方法不适用于规模较大的情况 - 特别是当您发布更新后,必须修改数十个站点时!因此,基于多年经验,我建议采用此方法,而不是上面建议的面向服务器的技术,这正是您提出的要做的。

上述代码只是确保这是一个完整的URL(而不是IP地址),并返回子域。它在我们的高负载环境中表现良好。

问题回答

你应该能够从 ServerVariables 集合中获得这个信息,但首先你需要正确配置IIS和DNS。所以你知道37Signals可能使用Apache或其他开源的unix Web服务器。在Apache上,这被称为虚拟主机

要使用IIS完成此操作,您需要为每个域创建一个新的DNS条目(将CNAME yourname.mysite.com创建为application.mysite.com),该条目指向IIS中的应用程序(application.mysite.com)。

然后,您需要在IIS应用程序(application.mysite.com)中创建一个主机标头条目,以接受您的名称.mysite.com的标头。用户实际上将访问application.mysite.com,但地址是自定义子域。然后,您要访问ServerVariables集合以获取值,以决定如何自定义站点。

注:根据需求,您可以选择几种替代实现。

  • Handle the host header processing at a hardware load balancer (more likely 37Signals do this, than rely on the web server), and create a custom HTTP header to pass to the web application.
  • Create a new web application and host header for each individual application. This is probably an inefficient implementation for a large number of users, but could offer better isolation and security for some people.

你需要配置你的DNS以支持通配符子域名。可以通过添加一个指向你的IP地址的A记录来完成,就像这样:

* A 1.2.3.4

一旦完成,您在域名前输入的任何内容都将发送到您的根域名,您可以通过拆分HTTP_HOST服务器变量来获得,就像上面的用户buggs所说的那样:

 string user = HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".")

//use the user variable to query the database for specific data

注:如果您使用的是共享主机,您可能需要从他们那里购买一个独特的IP插件,因为对于通配符域名,这是强制性的。如果您使用的是专用主机,则已经拥有自己的IP。

我所采用的方法是通过HttpContext.Request.ServerVariables["HTTP_HOST"].Split(".")实现的。

如果您需要更多的帮助,请告知我。





相关问题
热门标签