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

时间:2016-09-23 08:14:58

标签: iis asp.net-web-api2 asp.net-mvc-routing

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

我将所有操作都转到单一路线,因此点击localhost/<anything>将始终转到一条路线。

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

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

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

问题是当我在本地托管我的项目时,它最终以localhost/KITTENCORP.ADOPTION/结束,这是我项目的名称。因此,路线匹配不起作用。

我不确定如何考虑这个“根”地址。以前我只是查看Uri对象的域部分,但我需要在比较中包含此部分以使其工作(或忽略/删除它)。

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

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

1 个答案:

答案 0 :(得分:0)

对于任何绊倒这个并且想知道同样事情的人,我用这段代码修复了它:

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