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

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参数未被使用,代码里硬写了请求地址,参数传递不生效。
解决方法

按以下步骤修改代码即可解决卡住的问题:

  1. 全局配置TLS版本为1.2/1.3,兼容当前主流HTTPS接口要求
  2. 给请求添加标准User-Agent头,模拟浏览器请求绕过基础反爬校验
  3. 自定义请求超时时间,避免无限等待
  4. 用using语句包裹非托管资源,自动释放避免资源泄漏
  5. 给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.15 05:54:03