如何在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
相关产品推荐
相关产品推荐

