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 就没有后续了。。
不知问题出在何处。。
1
kk2syc 1 天前
你先用 curl 走一遍请求,然后 c#抓包看看有没有请求发出,发出的数据和 curl 对比
请求 json 的时候 request.GetResponse()会卡住,我猜测是服务器没有响应,加上没设置请求超时,所以没有 exception 返回,无限等待响应 |
2
ddup 1 天前
你用 fiddler 抓这个 json 请求,看看是啥状态。
|
3
Damn OP |
4
ddup 1 天前
我怀疑它可能就是卡,要么你用 post 工具,把请求参数全部搞成一样试试。
要么你 nginx 反代一层,然后你程序访问 nginx ,然后 fiddler 不要中间人代理 https ,代理 nginx 反代出的 http ,看卡不卡。 |
5
Damn OP @ddup 刚才排查了一下,不是接口的问题,但应该也不是系统的问题。
尝试了一下仅打开 fiddler ,不解密 https ,也能正常运行,但关掉 fiddler 就不行。 尝试了 request.Proxy = null; 也是不行。 然后尝试了一下把编译好的 exe 放到刚刚重装的系统里,也会卡住。。。 |
6
Damn OP @ddup 成了必须要有个 proxy 才能运行了。。
尝试把 request.ServicePoint.Expect100Continue = false; 注释掉之后,连 html 都会卡住。。 实在想不出来这么简单的代码怎么会出现这种现象。。 |
7
ddup 22 小时 0 分钟前
诡异,你要不改成异步试试。。。
|
9
kk2syc 19 小时 31 分钟前
把 request 和 response 的 header 都打印出,返回空值,先不要 return (HttpWebResponse)request.GetResponse();
|
10
dant 12 小时 23 分钟前
WebRequest 会调用 IE 相关组件,建议换成 HttpClient 试试
|