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

如何在C#中创建区分大小写的Uri对象?

解决C#中Uri自动转小写的问题

在C#里,Uri类默认会把主机名转成小写,这会导致依赖大小写区分的API地址失效。针对不同的.NET版本,有两种可行的解决办法:

.NET 5及以上版本(推荐)

从.NET 5开始,Uri新增了UriCreationOptions参数,可以直接禁用主机名规范化,保留原有的大小写:

var client = _httpClientFactory.CreateClient();

// 创建配置选项,禁用主机名规范化
var uriOptions = new UriCreationOptions
{
    DisableHostNameCanonicalization = true
};

// 使用带选项的Uri构造函数
client.BaseAddress = new Uri($"https://api-{caseSensitiveAppId}.domain.com/v2/", uriOptions);

设置DisableHostNameCanonicalization = true后,Uri不会再对主机名做转小写、去冗余点等规范化操作,完全保留你传入的原始大小写格式。

.NET Framework版本(兼容旧项目)

.NET Framework没有UriCreationOptions,可以直接跳过BaseAddress,在发送请求时拼接完整的地址字符串:

var client = _httpClientFactory.CreateClient();

// 直接拼接完整请求地址,避免Uri自动转小写
var fullRequestUrl = $"https://api-{caseSensitiveAppId}.domain.com/v2/{yourRelativePath}";
var request = new HttpRequestMessage(HttpMethod.Get, fullRequestUrl);

var response = await client.SendAsync(request);

如果一定要设置BaseAddress,可以通过反射修改Uri的私有主机名字段(注意:这种方式依赖.NET Framework内部实现,存在版本兼容风险):

var uri = new Uri($"https://api-{caseSensitiveAppId}.domain.com/v2/");
// 反射获取Uri的私有_host字段
var hostField = typeof(Uri).GetField("_host", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
if (hostField != null)
{
    // 手动设置原始大小写的主机名
    hostField.SetValue(uri, $"api-{caseSensitiveAppId}.domain.com");
}

var client = _httpClientFactory.CreateClient();
client.BaseAddress = uri;

内容的提问来源于stack exchange,提问作者Jay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.12 14:00:11