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

230 天前
 Damn
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 就没有后续了。。
不知问题出在何处。。

1523 次点击
所在节点    问与答
11 条回复
kk2syc
230 天前
你先用 curl 走一遍请求,然后 c#抓包看看有没有请求发出,发出的数据和 curl 对比

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

要么你 nginx 反代一层,然后你程序访问 nginx ,然后 fiddler 不要中间人代理 https ,代理 nginx 反代出的 http ,看卡不卡。
Damn
229 天前
@ddup 刚才排查了一下,不是接口的问题,但应该也不是系统的问题。
尝试了一下仅打开 fiddler ,不解密 https ,也能正常运行,但关掉 fiddler 就不行。
尝试了 request.Proxy = null; 也是不行。
然后尝试了一下把编译好的 exe 放到刚刚重装的系统里,也会卡住。。。
Damn
229 天前
@ddup 成了必须要有个 proxy 才能运行了。。
尝试把 request.ServicePoint.Expect100Continue = false; 注释掉之后,连 html 都会卡住。。
实在想不出来这么简单的代码怎么会出现这种现象。。
ddup
229 天前
诡异,你要不改成异步试试。。。
Damn
229 天前
@ddup 异步不行啊,sso 登录,每一步都需要用上一步返回的参数。。
kk2syc
229 天前
把 request 和 response 的 header 都打印出,返回空值,先不要 return (HttpWebResponse)request.GetResponse();
dant
229 天前
WebRequest 会调用 IE 相关组件,建议换成 HttpClient 试试
Damn
228 天前
@kk2syc
@dant 确实,换成 HttpClient 就能正常与服务器交互了。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1107733

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX