REST风格API路径参数含特殊字符时返回404问题咨询
问题根因
编码后的请求仍然返回404,是因为IIS和ASP.NET默认会先对URL做解码处理,将%2F转换为普通斜杠/后再进行路由匹配,因此还是会打乱路径结构。通配符参数报错是因为Web API强制要求通配符必须位于路由的最后一段。
解决方案
以下方案均不需要修改调用方的编码逻辑、也不需要限制referenceId的字符范围:
方案1:调整路由结构(推荐,无全局副作用)
仅修改路由的固定段顺序,让通配符参数处于路径最后一段即可:
[RoutePrefix("orders")] public class OrdersStatusController : ApiController { // 将固定的/status段移到动态参数前,通配符*会匹配后面所有完整内容 [HttpGet, Route("status/{*referenceId}")] public async Task<IHttpActionResult> StatusByReferenceIdAsync( [Required] string referenceId)
调整后请求URL格式为:
https://foo.bar/orders/status/srn::orders:/1801001003
无论referenceId中包含多少斜杠、冒号等特殊字符,路由都会自动将通配符后的全部内容赋值给referenceId参数,调用方无需做任何URL编码操作。
方案2:保留原有路径结构,修改全局配置
如果必须保留原有的/orders/{referenceId}/status URL结构,只需修改web.config的两处配置即可:
- 允许URL转义字符不被解析为路径分隔符:
<system.web> <httpRuntime relaxedUrlToFileSystemMapping="true" requestPathInvalidCharacters="" requestValidationMode="4.0" /> </system.web>
- 开启IIS双转义支持,允许编码后的特殊字符通过校验:
<system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.web>
配置生效后,调用方使用URL编码后的referenceId发起请求即可正常匹配路由。
方案3:自定义路由处理
如果既不能调整路由结构,也不想修改全局配置,可以自定义路由约束或者HTTP模块,手动从原始请求URL中提取/orders/和/status之间的所有内容,拼接为referenceId后赋值给接口参数。
内容的提问来源于stack exchange,提问作者Craig W.
相关产品推荐
相关产品推荐

