2008-12-09 76 views
5

我期待在使用ASP.NET一个新的SaaS服务,但对我的爱,我似乎无法弄清楚如何基于最喜欢的SaaS子域做帐查询应用程序(例如37Signals)。例如,如果我提供yourname.mysite.com,那么我将如何使用ASP.NET(MVC专门)来提取子域,以便我可以加载正确的模板(显示您公司的名称等)?可以通过常规路由完成吗?帐户基于查找

这似乎是SaaS的一个共同的东西,所以必须有一个简单的方法来做到这一点在ASP.NET;我知道有些插件可以用于其他框架,比如Ruby on Rails。

+0

如果您正在认真构建SaaS应用程序,并且您的团队对此类事情有困难,那么您的招聘流程存在问题。 – MarkR 2008-12-16 07:08:37

回答

3

这个工作对我来说:

//-------------------------------------------------------------------------------------------------------------------------- 
    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地址),并返回子域。它在我们处于相当高产量的环境中运行良好。

2

您应该能够从ServerVariables收藏挑这个,但首先你需要配置IIS和DNS才能正常工作。所以你知道37Signals可能使用Apache或其他开源的unix web服务器。在Apache上,这被称为VirtualHosting

要做到这一点与IIS,你需要创建一个新的DNS条目(创建一个CNAME yourname.mysite.com到application.mysite.com)为每个域指向您的应用程序在IIS(application.mysite.com )。

然后你create a host header entry in the IIS application(application.mysite.com)将接受头部yourname.mysite.com。用户实际上会打到application.mysite,com,但地址是自定义子域。然后访问ServerVariables集合以获取决定如何自定义网站的值。

注:还有,你可以根据需要遵循几个替代的实现。

  • 在硬件负载均衡器处理主机头处理(更可能37Signals公司做到这一点,不是依靠在Web服务器上),并创建一个自定义HTTP标头传递给Web应用程序。
  • 为每个单独的应用程序创建一个新的Web应用程序和主机头。对于大量用户来说,这可能是一个效率低下的实现,但可以为某些人提供更好的隔离和安全性。
0

我已经做了它的方式是HttpContext.Request.ServerVariables [ “HTTP_HOST”]。斯普利特( “”)。

让我知道你是否需要更多帮助。

1

您需要配置您的DNS以支持通配符子域。它可以通过添加一个A记录指向你的IP地址,这样做:

* 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 

PS。如果您使用的是共享主机,则可能需要通过它们的唯一IP插件,因为通配符域必须工作。如果您使用专用主机,您已拥有自己的IP。