C#调用Azure Maps API触发SocketException(10054)错误咨询
回答
1. System.Net.ServicePointManager.SecurityProtocol 的作用
这是.NET运行时提供的应用域级配置项,用来控制当前进程内所有基于ServicePoint实现的HTTP客户端(包括老版本HttpClient、WebRequest)在发起HTTPS握手时,会向服务端宣告支持的TLS/SSL协议版本列表。握手阶段双方会从共同支持的版本里选优先级最高的建立加密连接,版本不匹配就会直接断连。
注意:.NET Core 3.0、.NET 5及以上版本中,这个属性默认值就是SystemDefault,会直接继承操作系统的TLS配置,不需要手动修改。
2. System.Net.SecurityProtocolType 说明与Azure Maps的协议要求
这个枚举用来标记具体的TLS/SSL协议版本,各值对应含义:
Ssl3:SSL 3.0,存在严重安全漏洞,所有现代云服务均已禁用Tls:TLS 1.0,不安全,Azure全系列服务已禁用Tls11:TLS 1.1,不符合安全合规要求,Azure全系列服务已禁用Tls12:TLS 1.2,当前云服务普遍支持的最低安全版本Tls13:TLS 1.3,最新版本,安全性和性能更优,Azure已全量支持SystemDefault:由操作系统决定支持的协议版本和优先级,是微软官方推荐的配置方式
Azure Maps API的强制要求:所有请求必须使用TLS 1.2及以上版本,使用TLS 1.0/1.1发起的请求会被服务端直接拒绝。
3. 10054连接重置的非TLS配置类诱因
你已经尝试过所有常见的TLS配置方式,甚至换PowerShell发请求也复现相同错误,基本可以排除代码中TLS配置写错的问题,常见诱因按排查优先级排序:
- 网络出口拦截:企业内网防火墙、上网行为管理网关、本地杀毒软件、系统代理做了HTTPS流量审计/拦截,要么自身不支持TLS 1.2以上握手,要么将Azure Maps的域名加入了拦截列表,直接在握手阶段发送TCP重置包。优先换无企业策略的公网(比如手机热点)测试,换网后请求正常就能确认是网络出口问题。
- 运行环境过旧:如果使用.NET Framework 4.0及更早版本,就算代码中写了开启TLS 1.2,底层也没有对应实现;Windows 7未安装KB3140245补丁时,原生不支持将TLS 1.2作为客户端协议,无论代码怎么配置都无法完成握手。
HttpClient用法错误:如果每次发起请求都新建一个HttpClient实例,会导致本地TCP端口快速耗尽,也可能随机触发10054错误,不过这类问题一般是请求运行一段时间后才出现,不会第一次请求就报错。- 鉴权或限流问题:Azure Maps订阅密钥无效、请求频率超出配额时,部分边缘节点可能直接重置连接而非返回标准401/429响应,这类问题概率较低,放在最后排查即可。
正确配置参考
不要手动硬编码TLS版本,保持SystemDefault配置即可,硬编码版本会导致未来TLS版本迭代时需要修改代码重新发布。HttpClient建议声明为全局单例,避免端口耗尽问题:
// 全局初始化一次,复用实例 private static readonly HttpClient MapsClient = new HttpClient(); // 业务逻辑中直接使用该实例发起请求 var response = await MapsClient.SendAsync(request);
内容的提问来源于stack exchange,提问作者Surya
相关产品推荐
相关产品推荐

