You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的两处配置即可:

  1. 允许URL转义字符不被解析为路径分隔符:
<system.web>
  <httpRuntime 
    relaxedUrlToFileSystemMapping="true"
    requestPathInvalidCharacters=""
    requestValidationMode="4.0"
  />
</system.web>
  1. 开启IIS双转义支持,允许编码后的特殊字符通过校验:
<system.webServer>
  <security>
    <requestFiltering allowDoubleEscaping="true" />
  </security>
</system.web>

配置生效后,调用方使用URL编码后的referenceId发起请求即可正常匹配路由。

方案3:自定义路由处理

如果既不能调整路由结构,也不想修改全局配置,可以自定义路由约束或者HTTP模块,手动从原始请求URL中提取/orders/和/status之间的所有内容,拼接为referenceId后赋值给接口参数。

内容的提问来源于stack exchange,提问作者Craig W.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 00:48:03