For an Asp.Net software as a service application, I want to do account based subdomains like Basecamp and the rest of the 37Signals products have. E.g. acme.myapp.com will load
Maarten Balliauw's blog covered one method extending RouteBase. I think I've also seen a custom route handler used for this.
Also, this StackOverflow question covered the same question, using a more simplistic approach.
I definitely recommend factoring this code out into the routing side rather than embedding the logic to get domain information in your controllers.
We use:
public static string GetSubDomain()
{
string subDomain = String.Empty;
if (HttpContext.Current.Request.Url.HostNameType == UriHostNameType.Dns)
{
subDomain = Regex.Replace(HttpContext.Current.Request.Url.Host, "((.*)(\\..*){2})|(.*)", "$2");
}
if (subDomain.Length == 0)
{
subDomain = "www";
}
return subDomain.Trim().ToLower();
}
It's not very different compared to RoR. Just get the HTTP-Request, take the Host-Value, split it (at each dot) and take the first part to get the subdomain.
string subdomain = requestContext.HttpContext.
Request.Headers["Host"].Split('.')[0];
Then just resolve the subdomain to the Companies account.