Windows Server 2016下VBA WinHttp请求LinkedIn API失败求助
针对Windows Server 2016上VBA WinHttp请求LinkedIn API挂起问题的排查方案
看了你的问题描述,请求连Fiddler都抓不到,说明请求根本没离开本地WinHttp的处理层,完全是Server 2016环境的本地配置或安全策略问题,以下是几个具体的排查方向和解决方案:
1. 强制WinHttp使用TLS 1.2协议
虽然你用howsmyssl测试显示TLS1.2正常,但WinHttp在Server 2016的默认配置可能没明确启用TLS1.2,手动强制指定协议试试:
With New WinHttp.WinHttpRequest ' 强制启用TLS 1.2,&H800对应TLS1.2的标识 .Option(WinHttpRequestOption_SecureProtocols) = &H800 .Open "GET", "https://api.linkedin.com/v2/me?projection=(id,localizedFirstName,localizedLastName)", False .setRequestHeader "Authorization", "Bearer " & auth_AccessToken .setRequestHeader "Content-Type", "application/json" .Send End With
如果还是不行,可以试试同时启用TLS1.1和TLS1.2:.Option(WinHttpRequestOption_SecureProtocols) = &H200 + &H800
2. 更新Server 2016的根证书库
LinkedIn API的SSL证书可能依赖较新的根证书,而Server 2016默认的根证书库比Win10旧,导致WinHttp不信任该证书,直接拦截了请求:
- 以管理员身份打开命令提示符,运行
certutil -syncWithWU同步更新根证书 - 用IE浏览器直接访问
https://api.linkedin.com/v2/me,如果弹出证书错误提示,手动安装对应的根证书(按照提示完成证书安装)
3. 检查WinHttp的代理配置
WinHttp可能使用了系统代理,但代理规则阻止了api.linkedin.com的访问,或者自动代理配置异常:
- 运行
netsh winhttp show proxy查看当前WinHttp的代理设置 - 临时重置代理配置:
netsh winhttp reset proxy,之后再测试请求 - 也可以在代码里强制跳过代理,直接连接:
With New WinHttp.WinHttpRequest .Option(WinHttpRequestOption_Proxy) = 2 ' 2代表直接连接,不使用代理 .Option(WinHttpRequestOption_SecureProtocols) = &H800 .Open "GET", "https://api.linkedin.com/v2/me?projection=(id,localizedFirstName,localizedLastName)", False .setRequestHeader "Authorization", "Bearer " & auth_AccessToken .setRequestHeader "Content-Type", "application/json" .Send End With
4. 排查系统安全软件的拦截
Windows Server 2016的防火墙、Windows Defender或第三方安全软件(如EDR、杀毒软件)可能拦截了Access进程的出站请求:
- 检查Windows防火墙的出站规则,确认没有阻止
msaccess.exe或winhttp.dll的规则 - 临时关闭Windows Defender的实时保护(测试用,之后记得开启),再运行请求测试
- 如果有第三方安全软件,暂时禁用后测试是否能正常发送请求
5. 改用异步模式获取更详细的错误信息
同步模式下请求直接挂起超时,改用异步模式可能会返回具体的错误代码,帮助定位问题:
Dim httpReq As WinHttp.WinHttpRequest Set httpReq = New WinHttp.WinHttpRequest With httpReq ' 开启异步模式(第三个参数为True) .Open "GET", "https://api.linkedin.com/v2/me?projection=(id,localizedFirstName,localizedLastName)", True .Option(WinHttpRequestOption_SecureProtocols) = &H800 .setRequestHeader "Authorization", "Bearer " & auth_AccessToken .setRequestHeader "Content-Type", "application/json" .Send ' 循环等待请求完成 Do While .ReadyState <> 4 DoEvents Loop ' 在立即窗口输出状态和响应(按Ctrl+G查看) Debug.Print "状态码:" & .Status Debug.Print "响应内容:" & .ResponseText Debug.Print "错误信息:" & .StatusText End With
6. 更新WinHttp组件版本
Windows Server 2016的WinHttp.dll版本可能较旧,存在兼容性问题:
- 查看
C:\Windows\System32\winhttp.dll的版本号,对比Windows 10上的版本 - 安装Windows Server 2016的最新累积更新,更新系统核心组件
内容的提问来源于stack exchange,提问作者FrugalTPH
相关产品推荐
相关产品推荐

