.NET HttpClient如何避免URL中竖线|被自动编码?
解决.NET HttpClient请求中竖线|不被编码的方法
以下是几种可行的方案,根据你的.NET版本和场景选择:
1. 使用UriCreationOptions(.NET 6+ 推荐)
.NET 6及以上版本提供了UriCreationOptions类,可替代过时的dont escape属性,直接指定不转义特定字符:
// 拼接完整的请求地址 var fullUri = "https://你的服务域名/your/notstandardquerystringparam:term|otherterm"; var uriOptions = new UriCreationOptions { DontEscape = true }; // 构造不转义的Uri var targetUri = new Uri(fullUri, uriOptions); // 创建请求并发送 var requestMessage = new HttpRequestMessage(HttpMethod.Get, targetUri); var response = await _httpClient.SendAsync(requestMessage);
2. 手动处理路径字符串(兼容多数.NET版本)
先通过Uri.UnescapeDataString还原被自动编码的竖线,再构建Uri:
var relativePath = "your/notstandardquerystringparam:term|otherterm"; var builder = new UriBuilder("https://你的服务域名"); // 确保路径中的|不被编码 builder.Path = Uri.UnescapeDataString(relativePath); var requestMessage = new HttpRequestMessage(HttpMethod.Get, builder.Uri); var response = await _httpClient.SendAsync(requestMessage);
3. 自定义Handler拦截修改请求Uri(兜底方案)
如果无法修改Uri的构建逻辑,可以通过自定义DelegatingHandler,在请求发送前将编码后的%7C替换回原始|:
// 自定义Handler public class PreservePipeSymbolHandler : DelegatingHandler { protected override async Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { if (request.RequestUri != null) { // 将编码后的%7C替换回| var correctedUri = new Uri(request.RequestUri.ToString().Replace("%7C", "|")); request.RequestUri = correctedUri; } return await base.SendAsync(request, cancellationToken); } } // 初始化HttpClient时添加该Handler _httpClient = new HttpClient(new PreservePipeSymbolHandler()) { BaseAddress = new Uri("https://你的服务域名/") }; // 正常构建并发送请求 var requestMessage = _httpClient.PrepareRequestMessage($"your/notstandardquerystringparam:term|otherterm", HttpMethod.Get, null, null); var response = await _httpClient.SendAsync(requestMessage);
注意事项
- 优先使用方案1或2,更符合.NET框架的设计规范;方案3作为兜底,适合无法修改原有Uri构建逻辑的场景。
- 确保目标服务确实允许Uri中包含未编码的
|,避免违反RFC规范带来的其他问题。
内容的提问来源于stack exchange,提问作者Ctrl_Alt_Defeat
相关产品推荐
相关产品推荐

