You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 03:35:19