V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
Damn
V2EX  ›  问与答

用 C#搓了个小工具,但有个诡异的地方不知如何解决

  •  
  •   Damn · 1 天前 · 717 次点击
    ServicePointManager.ServerCertificateValidationCallback = delegate { return true; };
    private HttpWebResponse GetResponse(string url, string accept, ref CookieContainer container, bool allowRedirect, string referer)
    {
        HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
        request.ServicePoint.Expect100Continue = false;
        request.CookieContainer = container;
        request.Method = WebRequestMethods.Http.Get;
        request.AllowAutoRedirect = allowRedirect;
        request.KeepAlive = true;
        request.UserAgent = "Mozilla / 5.0(Windows NT 10.0; WOW64; Trident / 7.0; rv: 11.0) like Gecko";
        request.Accept = accept;
        request.Referer = referer;
        request.Headers["Accept-Encoding"] = "gzip, deflate";
        try
        {
            return (HttpWebResponse)request.GetResponse();
        }
        catch (WebException e)
        {
            if (e.Response == null)
            {
                throw;
            }
            return (HttpWebResponse)e.Response;
        }
    }
    

    有一不受控的外部服务器,证书 CN 不匹配,用 fiddler 进行中间人,证书 CN 与之匹配了,代码能如预期运行。
    不使用 fiddler ,在请求 html 的时候能正常获取内容,说明忽略证书错误的代码起作用了,但请求 json 的时候 request.GetResponse()会卡住,debug 时断点在这里,按 F10/F11 就没有后续了。。
    不知问题出在何处。。

    10 条回复    2025-01-26 01:58:43 +08:00
    kk2syc
        1
    kk2syc  
       1 天前
    你先用 curl 走一遍请求,然后 c#抓包看看有没有请求发出,发出的数据和 curl 对比

    请求 json 的时候 request.GetResponse()会卡住,我猜测是服务器没有响应,加上没设置请求超时,所以没有 exception 返回,无限等待响应
    ddup
        2
    ddup  
       1 天前
    你用 fiddler 抓这个 json 请求,看看是啥状态。
    Damn
        3
    Damn  
    OP
       1 天前 via iPhone
    @kk2syc
    @ddup 但是诡异在这个接口从来不卡,fiddler 做中间人的时候能正常返回 json ,继续其它的步骤。
    任意时刻 curl 或者用 fiddler 重放都是正常的。
    ddup
        4
    ddup  
       1 天前
    我怀疑它可能就是卡,要么你用 post 工具,把请求参数全部搞成一样试试。

    要么你 nginx 反代一层,然后你程序访问 nginx ,然后 fiddler 不要中间人代理 https ,代理 nginx 反代出的 http ,看卡不卡。
    Damn
        5
    Damn  
    OP
       23 小时 50 分钟前
    @ddup 刚才排查了一下,不是接口的问题,但应该也不是系统的问题。
    尝试了一下仅打开 fiddler ,不解密 https ,也能正常运行,但关掉 fiddler 就不行。
    尝试了 request.Proxy = null; 也是不行。
    然后尝试了一下把编译好的 exe 放到刚刚重装的系统里,也会卡住。。。
    Damn
        6
    Damn  
    OP
       23 小时 45 分钟前
    @ddup 成了必须要有个 proxy 才能运行了。。
    尝试把 request.ServicePoint.Expect100Continue = false; 注释掉之后,连 html 都会卡住。。
    实在想不出来这么简单的代码怎么会出现这种现象。。
    ddup
        7
    ddup  
       22 小时 0 分钟前
    诡异,你要不改成异步试试。。。
    Damn
        8
    Damn  
    OP
       21 小时 33 分钟前 via iPhone
    @ddup 异步不行啊,sso 登录,每一步都需要用上一步返回的参数。。
    kk2syc
        9
    kk2syc  
       19 小时 31 分钟前
    把 request 和 response 的 header 都打印出,返回空值,先不要 return (HttpWebResponse)request.GetResponse();
    dant
        10
    dant  
       12 小时 23 分钟前
    WebRequest 会调用 IE 相关组件,建议换成 HttpClient 试试
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2909 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 06:21 · PVG 14:21 · LAX 22:21 · JFK 01:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.