2

Is there any way in ASP.net C# to treat sub-domain as query string?

I mean if the user typed london.example.com then I can read that he is after london data and run a query based on that. example.com does not currently have any sub-domains.

Joel Coehoorn
  • 399,467
  • 113
  • 570
  • 794
asmgx
  • 7,328
  • 15
  • 82
  • 143

3 Answers3

3

This is a DNS problem more than an C#/ASP.Net/IIS problem. In theory, you could use a wildcard DNS record. In practice, you run into this problem from the link:

The exact rules for when a wild card will match are specified in RFC 1034, but the rules are neither intuitive nor clearly specified. This has resulted in incompatible implementations and unexpected results when they are used.

So you can try it, but it's not likely to end well. Moreover, you can fiddle with things until it works in your testing environment, but that won't be able to guarantee things go well for the general public. You'll likely do much better choosing a good DNS provider with an API, and writing code to use the API to keep individual DNS entries in sync. You can also set up your own public DNS server, though I strongly recommend using a well-known and reputable commercial DNS host.

An additional problem you can run into is the TLS/SSL certificate (because of course you're gonna use HTTPS. Right? RIGHT!?) You can try a wild card certificate and probably be okay, but depending on what else you do you may find it's not adequate; suddenly you're needing to provision a separate SSL certificate for every city entry in your database, and that can be a real pain, even via the Let's Encrypt service.

If you do try it, IIS is easily capable of mapping the requests to your ASP.Net app based on a wildcard host name, and ASP.Net itself is easily capable of reading and parsing the host name out of the request and returning different results based on that. IIS URL re-writing should be able to help with this, though I'm not sure whether you can do stock MVC routing in C#/ASP.Net based on this attribute.

Joel Coehoorn
  • 399,467
  • 113
  • 570
  • 794
1

A low tech solution can be like this: (reference: https://www.pavey.me/2016/03/aspnet-c-extracting-parts-of-url.html)

    public static List<string> SubDomains(this HttpRequest Request)
    {
        // variables
        string[] requestArray = Request.Host().Split(".".ToCharArray());
        var subDomains = new List<string>();

        // make sure this is not an ip address
        if (Request.IsIPAddress())
        {
            return subDomains;
        }

        // make sure we have all the parts necessary
        if (requestArray == null)
        {
            return subDomains;
        }

        // last part is the tld (e.g. .com)
        // second to last part is the domain (e.g. mydomain)
        // the remaining parts are the sub-domain(s)
        if (requestArray.Length > 2)
        {
            for (int i = 0; i <= requestArray.Length - 3; i++)
            {
                subDomains.Add(requestArray[i]);
            }
        }

        // return
        return subDomains;
    }

    // e.g. www
    public static string SubDomain(this HttpRequest Request)
    {
        if (Request.SubDomains().Count > 0)
        {
            // handle cases where multiple sub-domains (e.g. dev.www)
            return Request.SubDomains().Last();
        }
        else
        {
            // handle cases where no sub-domains
            return string.Empty;
        }
    }

    // e.g. azurewebsites.net
    public static string Domain(this HttpRequest Request)
    {
        // variables
        string[] requestArray = Request.Host().Split(".".ToCharArray());

        // make sure this is not an ip address
        if (Request.IsIPAddress())
        {
            return string.Empty;
        }

        // special case for localhost
        if (Request.IsLocalHost())
        {
            return Request.Host().ToLower();
        }

        // make sure we have all the parts necessary
        if (requestArray == null)
        {
            return string.Empty;
        }

        // make sure we have all the parts necessary
        if (requestArray.Length > 1)
        {
            return $"{requestArray[requestArray.Length - 2]}.{requestArray[requestArray.Length - 1]}";
        }

        // return empty string
        return string.Empty;
    }

Following question is similar to yours:

Using the subdomain as a parameter

Gauravsa
  • 6,330
  • 2
  • 21
  • 30
1

I have to add to the previous answers, that after you fix the dns, and translate the subdomain to some parameters you can use the RewritePath to move that parameters to your pages.

For example let say that a function PathTranslate(), translate the london.example.com to example.com/default.aspx?Town=1

Then you use the RewritePath to keep the sub-domain and at the same time send your parameters to your page.

string sThePathToReWrite = PathTranslate();

if (sThePathToReWrite != null){
    HttpContext.Current.RewritePath(sThePathToReWrite, false);
}

string PathTranslate()
{
    string sCurrentPath = HttpContext.Current.Request.Path;
    string sCurrentHost = HttpContext.Current.Request.Url.Host;

    //... lot of code ...

    return strTranslatedUrl
}
Aristos
  • 66,005
  • 16
  • 114
  • 150