.NET Framework 4.8 WebAPI路由:如何获取含斜杠的path参数?
解决.NET Framework 4.8 WebAPI路由中含斜杠的参数匹配问题
针对你的场景,有两种可行的解决方案:
方案一:使用正则路由约束修改路由属性
在路由参数path上添加非贪婪正则约束,让它匹配到/child之前的所有内容(包括斜杠),修改后的路由定义如下:
[Route("gdoc/a/G1/{code}/{path:regex(.*?)}/child")] public IHttpActionResult YourApiMethod(string code, string path) { // 此时path变量会完整获取到带斜杠的路径值,比如"5-787/folder1/james/titi.png" return Ok(path); }
原理:正则.*?是非贪婪匹配模式,会精准匹配从{code}之后到/child之前的所有字符,包括路径中的斜杠,避免路由引擎将斜杠视为分段符。
方案二:手动解析请求URL提取参数
如果正则约束无法生效,可以直接在方法内解析原始请求URL,手动截取目标路径部分:
[Route("gdoc/a/G1/{code}/child")] public IHttpActionResult YourApiMethod(string code) { var requestPath = Request.RequestUri.AbsolutePath; var codePrefix = $"/gdoc/a/G1/{code}/"; var childSuffix = "/child"; var startPos = requestPath.IndexOf(codePrefix) + codePrefix.Length; var endPos = requestPath.IndexOf(childSuffix, startPos); if (endPos == -1) { return BadRequest("URL格式不符合要求"); } var path = requestPath.Substring(startPos, endPos - startPos); // 处理获取到的path return Ok(path); }
原理:跳过路由参数的自动匹配,直接从请求路径中定位code之后、/child之前的片段,提取出完整的带斜杠路径。
备选方案(需客户端配合)
如果可以调整客户端请求方式,让客户端将路径中的斜杠做URL编码(把/替换为%2F),服务端接收后再解码:
[Route("gdoc/a/G1/{code}/{path}/child")] public IHttpActionResult YourApiMethod(string code, string path) { var decodedPath = Uri.UnescapeDataString(path); // 使用解码后的路径 return Ok(decodedPath); }
这种方案需要客户端发送编码后的URL(比如https:/server/gdoc/a/G1/IDS/5-787%2Ffolder1%2Fjames%2Ftiti.png/child),适合能控制客户端实现的场景。
内容的提问来源于stack exchange,提问作者papoxe
相关产品推荐
相关产品推荐

