ASP.NET 突然想要一个尾部斜杠

ASP.NET suddenly wants a trailing slash

在 ASP.NET 应用程序中,我们有很多(想想,几十个)这样的控制器 类:

[RoutePrefix("some/thing/1.0")]
public class SomeController : ApiController
{
    [HttpGet]
    [Route("")]
    public string GetInfo()
    {
        return "hello world";
    }

    [HttpPut]
    [Route("")]
    public void StoreInfo(string info)
    {
        // ...
    }
}

这几个星期以来一直运行良好,没有任何问题。我们可以如下调用这些端点:

GET https://myWebApp/client/some/thing/1.0

现在,昨天的夜间构建已停止工作。突然间,我们只能访问那些带有尾部斜杠的 URL,即

GET https://myWebApp/client/some/thing/1.0/

这也适用于参数化查询:

GET https://myWebApp/client/some/thing/1.0?x=42

不再有效,但是

GET https://myWebApp/client/some/thing/1.0/?x=42

会。

由于最后一个工作构建仅在一天前,我扫描了源代码管理的提交历史,并并排比较了构建包。我找不到任何似乎与此问题相关的更改。

此外,这肯定与我们应用程序中的某些更改有关:在将我的二进制文件更新为昨天构建的二进制文件后,我可以在应用程序的本地副本上重现该问题。 (请注意,今天早上创建了另一个构建,问题仍然存在。所以,并不是昨天的构建在某种程度上被破坏了;任何改变似乎都是永久性的。)

可能发生了什么变化,我还能去哪里寻找它?

或者,更主动地询问:

我在哪里可以更改此行为?

我们已经找到错误现在开始出现的具体原因:

MapSignalR 的调用已被注释掉,如果没有它,埋藏在应用程序配置文件某处的更旧的、可能是错误的设置将变为活动状态: 一个 TransferRequestHandler,其路径被指定为 *. 而不是 *.

据推测,SignalR 会在初始化后以某种方式覆盖该设置,因此该问题在过去几年中从未出现过。

所以,明确地说:Web.config 文件包含以下行:

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>

这必须更改为

<add name="ExtensionlessUrlHandler-Integrated-4.0" path="*" verb="*" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0"/>

为了解决此处描述的问题。

(不幸的是,此解决方案导致 another problem。)