如何向Web API传递空字符串类型的路由参数?
问题原因
- URL路径中的连续斜杠会被ASP.NET路由模块以及Web服务器(如IIS)自动合并为单个斜杠,你请求
https://localhost:44319/api/SearchSelectController//Tom时,实际解析后的路径是api/SearchSelectController/Tom,只有1个路径参数,无法匹配你定义的需要2个路径参数的路由规则,导致匹配失败。 - 你示例中控制器定义名为
SearchController,但调用地址中写的是SearchSelectController,名称不一致也是报错的原因之一,需要先统一控制器名称。
可行解决方案
方案1:改用查询字符串传递参数(最推荐)
把参数从路由路径中移到URL查询部分,空字符串可以直接正常传递,不会触发斜杠合并问题:
修改路由,去掉路径中的参数定义:
public class SearchController : ApiController { [Route("api/SearchController")] public string Get(string paramOne, string paramTwo) { return "The [Route] with multiple params worked.\nP1 : " + paramOne + " P2 : " + paramTwo; } }
调用时使用如下格式即可传递空参数:https://localhost:44319/api/SearchController?paramOne=¶mTwo=Tom
方案2:路由参数标记为可选并设置默认空值
修改Route属性的参数定义,添加?标记为可选,同时给Action参数设置默认空字符串,可配合自定义占位符实现空值传递:
public class SearchController : ApiController { [Route("api/SearchController/{paramOne?}/{paramTwo?}")] public string Get(string paramOne = "", string paramTwo = "") { // 约定占位符_代表空字符串,接收后做替换 paramOne = paramOne == "_" ? "" : paramOne; paramTwo = paramTwo == "_" ? "" : paramTwo; return "The [Route] with multiple params worked.\nP1 : " + paramOne + " P2 : " + paramTwo; } }
调用时格式为:https://localhost:44319/api/SearchController/_/Tom
方案3:修改Web服务器配置允许连续斜杠
如果必须保留路径参数的写法,可修改Web.config配置,禁用斜杠自动合并:
在<system.web>节点下添加:
<httpRuntime relaxedUrlToFileSystemMapping="true" />
在<system.webServer>节点下添加:
<security> <requestFiltering allowDoubleEscaping="true" /> </security>
该方案兼容性较差,不同版本的IIS/.NET Framework表现可能不一致,不优先推荐。
内容的提问来源于stack exchange,提问作者asmgx
相关产品推荐
相关产品推荐

