ASP.Net应用无法连接Web API 调用GetResponse报基础连接关闭错误
问题修复方案
The underlying connection was closed: An unexpected error occurred on a send是HTTPS请求的常见错误,按以下优先级排查修复即可:
- TLS版本不匹配:目前绝大多数HTTPS API已经禁用TLS 1.0/1.1,仅支持TLS 1.2及以上版本。.NET Framework 4.0及更早版本默认只开启TLS 1.0,协商加密通道时会被服务器直接断开,正好触发这个错误。
- 请求方法写法错误:
HttpWebRequest.Method只接受字符串类型参数,你写的LetMCmyrequest.Method = HttpMethod.Get;传入的是HttpMethod对象,会导致请求方法不符合服务器预期,部分服务端会直接断开连接不返回错误码。 - 缺失必要请求头:很多API服务会拦截没有
User-Agent头的请求,直接断开连接。 - 无效配置冗余:你用Header传
api_key做鉴权,完全不需要初始化空的CredentialCache赋值给请求对象,反而可能触发多余的认证协商流程。
修复操作
- 发起请求前显式开启TLS 1.1/1.2支持
- 把Method赋值改成正确的字符串
"GET" - 给请求加上通用
User-Agent头 - 删除冗余的空凭据配置
- 补全资源释放逻辑,优化异常打印方便后续排查
修正后代码
class WebApi_LetMCGetBranches { public string GetLetMCBranch() { string url = "https://apiurl.com"; HttpWebResponse LetMCresponse = null; try { // 显式指定TLS协议版本,适配现代HTTPS接口 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11; HttpWebRequest LetMCmyrequest = (HttpWebRequest)WebRequest.Create(url); LetMCmyrequest.Method = "GET"; // 添加User-Agent头,避免被服务端拦截 LetMCmyrequest.UserAgent = "LetMC Api Client/1.0"; LetMCmyrequest.Accept = "application/xml"; // 显式指定接收XML格式返回 LetMCmyrequest.Headers.Add("api_key", "123456"); LetMCresponse = (HttpWebResponse)LetMCmyrequest.GetResponse(); using (Stream responseStream = LetMCresponse.GetResponseStream()) using (StreamReader reader = new StreamReader(responseStream)) { // 直接从流加载XML,不需要多次序列化转义 XDocument resultDoc = XDocument.Load(reader); System.Diagnostics.Debug.WriteLine(resultDoc.ToString()); foreach (XElement branch in resultDoc.Descendants("branch")) { if (branch.Element("name")?.Value == "Peterborough") { return branch.Element("url")?.Value ?? string.Empty; } } } } catch (WebException ex) { // 打印完整错误信息,包括内部异常,方便定位根因 System.Diagnostics.Debug.WriteLine($"请求失败:{ex.Message}\n内部错误:{ex.InnerException?.Message}"); if (ex.Response is HttpWebResponse errorResp && errorResp.StatusCode == HttpStatusCode.Unauthorized) { // 401鉴权失败逻辑,可在这里检查api_key是否正确 return string.Empty; } throw; } finally { // 主动释放响应资源 LetMCresponse?.Dispose(); } return string.Empty; } }
后续排查提示
如果修改后还是报错,直接看调试窗口打印的内部异常信息:
- 如果提示证书验证失败,本地调试可临时加证书校验回调跳过验证,生产环境必须部署服务器信任的合法SSL证书
- 如果依然报连接关闭,用抓包工具对比你代码发的请求和Swagger里成功的请求头,补全缺失的头字段即可
内容的提问来源于stack exchange,提问作者Donovan
相关产品推荐
相关产品推荐

