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。)
在 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。)