向ASP.NET Core端点传递含+号的URL路径参数失败求助
解决ASP.NET Core路径参数含+号的请求失败问题
针对你遇到的路径参数含+号(已编码为%2B)但请求在进入控制器前失败的问题,可通过以下几种方案解决:
方案1:修改路由模板,使用通配符捕获参数
将路由参数改为{fileName*}和{urlKey*},通配符*允许路由系统捕获包含特殊字符的完整路径段,确保编码后的%2B能被正确解码:
[HttpGet("GetFileDownloadLink/{fileName*}/{urlKey*}")] public IActionResult GetFileDownloadLink(string fileName, string urlKey) { // fileName 会被自动解码为 "a+b.pdf" return Ok(fileService.GetDownloadLink(fileName, urlKey)); }
方案2:配置路由选项允许特殊字符
在Program.cs中配置RouteOptions,明确允许路径中包含未转义的特殊字符(如+、%):
builder.Services.Configure<RouteOptions>(options => { // 允许路径中包含未转义的特殊字符 options.AllowUnescapedCharactersInPath = true; });
方案3:IIS部署时允许双重转义
如果你的API部署在IIS或IIS Express上,IIS默认会拦截包含%2B的请求(认为是双重转义),需修改web.config开启双重转义支持:
<configuration> <system.webServer> <security> <requestFiltering allowDoubleEscaping="true" /> </security> </system.webServer> </configuration>
验证说明
修改完成后,使用编码后的URLhttp://localhost:55917/api/abc/files/getFileDownloadLink/a%2Bb.pdf/9846.pdf发起请求,控制器的fileName参数会正确接收a+b.pdf,请求可正常进入控制器逻辑。
另外,若配置了允许未转义字符,直接传递未编码的+号(如http://localhost:55917/api/abc/files/getFileDownloadLink/a+b.pdf/9846.pdf)也能正常工作,但为符合URL规范,建议优先使用%2B编码。
内容的提问来源于stack exchange,提问作者Thenura Illandara
相关产品推荐
相关产品推荐

