Search code examples
iisasp.net-web-api2asp.net-mvc-routing

Hosting project in IIS appends project name to the URL and breaks my routing


I have a web api 2 project, and in my code I do some routing stuff myself.

I have all my actions going to a single route, so hitting localhost/<anything> will always go to one route.

In that route I am doing some custom pattern matching.

If the user goes to /Kittens/AdoptAKitten/12345

It will match against a template I have using regex, defined as /Kittens/AdoptAKitten/{something}

The problem is when I host my project locally, it ends up at localhost/KITTENCORP.ADOPTION/ which is the name of my project. As a result the route matching doesn't work.

I am not sure how to take into account this 'root' address. Previously I was just looking at the domain part of the Uri object but I need to include this part in the comparison to make it work (or disregard/remove it).

This code will however also be deployed to a server somewhere at which point it will probably be hosted on adoptionservice.kittens.org and thus adoptionservice.kittens.org/Kittens/AdoptAKitten/12345 will be the url. So it has to account for both situations.

Any ideas how I can resolve this problem?


Solution

  • For anyone stumbling across this and wondering the same thing, I fixed it with this code:

    // When hosted in IIS it may get a virtual path such as localhost/KittenLibrary that needs including in comparisons
    if (!string.IsNullOrEmpty(HttpRuntime.AppDomainAppVirtualPath))
    {
        urlStart = UrlCombine(urlStart, HttpRuntime.AppDomainAppVirtualPath);
    }
    

    UrlCombine is a function I pinched from another SO question:

    private static string UrlCombine(string url1, string url2)
    {
        if (url1.Length == 0)
        {
            return url2;
        }
    
        if (url2.Length == 0)
        {
            return url1;
        }
    
        url1 = url1.TrimEnd('/', '\\');
        url2 = url2.TrimStart('/', '\\');
    
        return string.Format("{0}/{1}", url1, url2);
    }