C# HttpWebRequest请求HTTPS接口卡在HttpWebResponse行无报错如何解决
问题原因
- 未配置TLS协议版本:当前绝大多数HTTPS接口仅支持TLS 1.2及以上版本,C#默认的
ServicePointManager.SecurityProtocol配置可能包含低版本TLS,SSL握手阶段会卡住无响应,不会主动抛出异常。 - 缺失必要请求头:你访问的nseindia接口有反爬校验,未携带
User-Agent等标准浏览器请求头的请求会被服务端拦截,服务端不返回响应导致请求一直挂起。 - 未设置超时时间:HttpWebRequest默认超时时间长达100秒,未自定义超时的情况下你会误认为程序永久卡住。
- 空catch块吞异常:你写的catch代码块没有任何异常处理逻辑,即使请求抛出异常也不会有任何提示,会误以为程序没有进入catch块。
- 资源未正确释放:
HttpWebResponse、Stream等非托管资源未主动释放,多次调用后也可能出现请求卡住的问题。 - 代码逻辑错误:方法传入的URL参数未被使用,代码里硬写了请求地址,参数传递不生效。
解决方法
按以下步骤修改代码即可解决卡住的问题:
- 全局配置TLS版本为1.2/1.3,兼容当前主流HTTPS接口要求
- 给请求添加标准
User-Agent头,模拟浏览器请求绕过基础反爬校验 - 自定义请求超时时间,避免无限等待
- 用
using语句包裹非托管资源,自动释放避免资源泄漏 - 给catch块添加异常日志输出,方便排查问题
修改后完整代码如下:
using System; using System.IO; using System.Net; using System.Text; public static string GetWebSource(string URL) { StringBuilder sb = new StringBuilder(); if (string.IsNullOrWhiteSpace(URL)) return sb.ToString(); // TLS配置全局设置一次即可,不需要每次调用都执行 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls13; // 测试环境可开启跳过证书校验,生产环境建议删除该行避免安全风险 ServicePointManager.ServerCertificateValidationCallback = (sender, cert, chain, sslPolicyErrors) => true; try { byte[] buf = new byte[8192]; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(URL); request.ContentType = "application/json"; request.Method = "GET"; // 添加模拟Chrome浏览器的User-Agent request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"; // 设置10秒超时,单位为毫秒 request.Timeout = 10000; request.ReadWriteTimeout = 10000; using (HttpWebResponse response = (HttpWebResponse)request.GetResponse()) using (Stream resStream = response.GetResponseStream()) { string tempString = null; int count = 0; do { count = resStream.Read(buf, 0, buf.Length); if (count != 0) { tempString = Encoding.UTF8.GetString(buf, 0, count); sb.Append(tempString); } } while (count > 0); } } catch (Exception ex) { // 输出异常信息,方便排查问题 Console.WriteLine($"请求失败:{ex.Message},异常详情:{ex.StackTrace}"); } return sb.ToString(); } // 调用示例 // string result = GetWebSource("https://www.nseindia.com/api/option-chain-indices?symbol=NIFTY");
补充注意事项
- 如果接口还有更严格的反爬限制,可以通过抓包工具查看浏览器请求的完整头信息,给请求补充Referer、Cookie等头即可正常请求。
- 生产环境如果访问的是正规CA签发证书的HTTPS接口,不需要自定义
ServerCertificateValidationCallback回调,避免出现证书校验绕过的安全问题。
内容的提问来源于stack exchange,提问作者Trainglab
相关产品推荐
相关产品推荐

