【问题标题】:Hosting project in IIS appends project name to the URL and breaks my routing在 IIS 中托管项目会将项目名称附加到 URL 并破坏我的路由
【发布时间】:2016-09-23 08:14:57
【问题描述】:

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

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

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

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

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

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

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

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

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

【问题讨论】:

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


    【解决方案1】:

    对于遇到此问题并想知道相同问题的任何人,我使用以下代码修复它:

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

    【讨论】:

      猜你喜欢
      • 2011-01-03
      • 2020-02-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 2015-02-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多