asp.net - 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 解释管道字符的任何内容,但找不到任何内容。同样,只有一台服务器出现此问题。在我们所有的其他装置上,管道字符都可以正常工作并与该路线相匹配。
解决方案
我无法发表评论,但我试一试作为解决方案。
如果它不起作用,请告诉我。
检查 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
推荐阅读
- javascript - 模块模式 - 关注点分离 - ES6 中的封装
- arrays - 如何使用带有 Node.js 的变量从数组中检索值
- ios - iOS 在 3D touch 上添加“添加小部件”
- javascript - 在 React JS 中单击浏览器后退按钮时,window.location,hash 会出现问题
- python - python - 如何在特定位置的x轴上设置刻度
- regex - Lua:子字符串
- xsl-fo - wintitle用在什么地方?
- php - 一般如何在我的数据库中添加记录?
- python - 将所有文档的列更新到 Elasticsearch 的最佳实践
- bash - 为什么我要做 Cmake .. 并制作?