IIS 中的托管项目将项目名称附加到 URL 并中断我的路由

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

我有一个 web api 2 项目,在我的代码中我自己做了一些路由工作。

我所有的动作都在一条路线上,所以点击 localhost/<anything> 将始终在一条路线上。

在那条路线中,我正在做一些自定义模式匹配。

如果用户转到 /Kittens/AdoptAKitten/12345

它将匹配我使用正则表达式的模板,定义为 /Kittens/AdoptAKitten/{something}

问题是当我在本地托管我的项目时,它以 localhost/KITTENCORP.ADOPTION/ 结尾,这是我的项目名称。结果路由匹配不起作用。

我不确定如何考虑这个 'root' 地址。以前我只是查看 Uri 对象的域部分,但我需要将这部分包含在比较中以使其工作(或 disregard/remove 它)。

然而,此代码也将部署到某处的服务器,此时它可能托管在 adoptionservice.kittens.org 上,因此 adoptionservice.kittens.org/Kittens/AdoptAKitten/12345 将是 url。所以它必须考虑这两种情况。

有什么办法可以解决这个问题吗?

对于任何遇到这个问题并想知道同样事情的人,我用这段代码修复了它:

// 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 是我从另一个 SO 问题中提取的函数:

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);
}