marcus
marcus

Reputation: 10096

Get top level domain

I'm using Url.RouteUrl("My_Route", new RouteValueDictionary(new { some = "value" }),"http","hostname") and now I need to get the hostname from the url but just the top domain. For example I'm running my site using ui.foo.local and the I need to route the url to just foo.local. Is there a a built in way of doing this in mvc or c#?

Upvotes: 1

Views: 728

Answers (1)

Paul Grimshaw
Paul Grimshaw

Reputation: 21034

I had this problem, and wrote a little domain Url splitter class as I couldn't find any easy way to do it. Didn't spend too long on it, so happy to get some feedback. You use it like this:

var splitter = new DomainSplitter("http://stackoverflow.com");
var domain = splitter.DomainPart;

Class is here:

public  class DomainSplitter {
    public string DomainPart { get; private set; }
    public string SubDomainPart { get; private set; }
    public string SchemePart { get; private set; }
    public string QueryPart { get; private set; }

    public DomainSplitter(string url) {

        if (string.IsNullOrEmpty(url)) {
            throw new Exception("urlString or expected sub domain were null or empty");
        }

        if (url.Contains("://")) {
            ShemePart = url.Split(':')[0] + "://";
            url = url.Remove(0, FirstPart.Length);
        }


        var endOfDomainIndex = url.IndexOfAny("?/".ToCharArray());
        if (endOfDomainIndex == -1) {
            endOfDomainIndex = url.Length;
        }

        int startOfDomainIndex;
        var domainStub = url.Substring(0, endOfDomainIndex);
        var noOfDots = domainStub.Length - domainStub.Replace(".", "").Length;
        switch (noOfDots) {
            case 0:
                startOfDomainIndex = 0;
                break;

            case 1:
                startOfDomainIndex = 0;
                if (url.Contains("localhost")) {
                    startOfDomainIndex = url.IndexOf(".") + 1;
                }
                break;

            default:
                startOfDomainIndex = url.IndexOf(".") + 1;
                break;
        }

        if (url.Contains("?")) {
            QueryPart = "?" + url.Split('?')[1];    
        }
        else {
            QueryPart = "";
        }

        SubDomainPart = startOfDomainIndex > 0 ? url.Substring(0, startOfDomainIndex - 1) : "";
        DomainPart = url.Substring(startOfDomainIndex, endOfDomainIndex - startOfDomainIndex);


    }
}

Upvotes: 1

Related Questions