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

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赋值给请求对象,反而可能触发多余的认证协商流程。

修复操作

  1. 发起请求前显式开启TLS 1.1/1.2支持
  2. 把Method赋值改成正确的字符串"GET"
  3. 给请求加上通用User-Agent头
  4. 删除冗余的空凭据配置
  5. 补全资源释放逻辑,优化异常打印方便后续排查

修正后代码

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 08:31:06