首页 > 解决方案 > ASP.NET 路由参数中的管道字符导致 404

问题描述

我们有一个带有以下路由的 ASP.NET Web API 方法:

[System.Web.Http.Route( "api/MergeFields/{id}" )]
public virtual string Get( string id )
{
    ...
}

在我们的大多数服务器上,如果 url 中的 {id} 参数包含管道字符,它仍然会匹配路由:http://www.example.com/api/MergeFields/Global|Test。但是,我们有一台 IIS 服务器,它返回 404 错误。

对管道字符进行编码没有帮助:http ://www.example.com/api/MergeFields/GlobalAttribute%7CTest ,它仍然返回 404。

在同一台服务器上,{id}​​ 参数中的任何其他字符都可以正常工作。例如http://www.example.com/api/MergeFields/GlobalAttribute_Test有效。

我在 web.config 中搜索了可能会影响 IIS 或 ASP.NET 解释管道字符的任何内容,但找不到任何内容。同样,只有一台服务器出现此问题。在我们所有的其他装置上,管道字符都可以正常工作并与该路线相匹配。

标签: asp.netiisasp.net-web-apiroutes

解决方案


我无法发表评论,但我试一试作为解决方案。
如果它不起作用,请告诉我。

检查 HttpRuntimeSection.RelaxedUrlToFileSystemMapping 属性,这可能是问题所在。

在您的 web.config 下,您可能应该像这样设置它(.NET 4.0):

<system.web>
   <httpRuntime requestValidationMode="2.0" relaxedUrlToFileSystemMapping="true"/>
</system.web>

我不知道你的环境,但我假设你使用 4.0。

Edit2:
还阅读了有关请求过滤(可能阻止请求的服务)的信息。良好的信息和可能的其他几个动词,您可以使用“白名单”您的管道字符:https ://docs.microsoft.com/en-us/iis/configuration/system.webserver/security/requestfiltering/

编辑:
仅供参考,管道被定义为“不安全字符”。我建议阅读有关选择分隔符的文档:https ://sites.google.com/site/getsnippet/javascript/ut/url-encoded-characters/-please-stop-using-unsafe-characters-in-urls


推荐阅读