C#跨API调用Post接口返回404:URI含特殊字符问题
解决C# API调用时因隐藏字符导致的404错误
问题根源
你遇到的%E2%80%8B是**零宽空格(Zero-Width Space)**的URL编码,这种字符肉眼不可见,但会被.NET的URI处理逻辑识别为有效字符,导致最终请求的路径被篡改,后端无法匹配到正确端点,从而返回404。
从代码来看,字符串拼接的URL中($"{baseUrl}/v1/abc/add"),v1/与abc之间、abc与/add之间大概率混入了这种隐藏字符,通常是复制粘贴外部文本时带入的。
修复方案
方案1:手动清理隐藏字符
直接重新输入URL路径部分,确保没有不可见字符:
var baseUrl = "https://services.abc.com:1232/something"; HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, $"{baseUrl}/v1/abc/add"); requestMessage.Content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); var response = await client.SendAsync(requestMessage);
方案2:使用Uri构造函数拼接(更可靠)
避免直接字符串拼接,改用Uri的嵌套构造函数处理路径拼接,它会自动过滤或规范化非法字符:
var baseUrl = new Uri("https://services.abc.com:1232/something"); var endpoint = "/v1/abc/add"; HttpRequestMessage requestMessage = new HttpRequestMessage(HttpMethod.Post, new Uri(baseUrl, endpoint)); requestMessage.Content = new StringContent(JsonConvert.SerializeObject(request), Encoding.UTF8, "application/json"); var response = await client.SendAsync(requestMessage);
验证方法
可以将拼接后的URI输出到日志或控制台,检查是否还包含%E2%80%8B编码:
Console.WriteLine(requestMessage.RequestUri.AbsoluteUri);
也可以在代码编辑器中开启显示控制字符的功能(比如VS Code开启"控制字符可见性"),直接查看原始字符串中的隐藏字符。
内容的提问来源于stack exchange,提问作者Dee
相关产品推荐
相关产品推荐

