通过SSL发送带有HttpWebRequest的请求时出现错误502(错误网关)

我在经典ASP中有以下代码段,用于发送命令并通过SSL检索响应:

Dim xmlHTTP Set xmlHTTP = Server.CreateObject("Msxml2.ServerXMLHTTP.3.0") xmlHTTP.open "POST", "https://www.example.com", False xmlHTTP.setRequestHeader "Content-Type","application/x-www-form-urlencoded" xmlHTTP.setRequestHeader "Content-Length", Len(postData) xmlHTTP.Send postData If xmlHTTP.status = 200 And Len(message) > 0 And Not Err Then Print xmlHTTP.responseText End If 

然后我使用此代码作为参考,在c#中重新实现请求:

 private static string SendRequest(string url, string postdata) { WebRequest rqst = HttpWebRequest.Create(url); // We have a proxy on the domain, so authentication is required. WebProxy proxy = new WebProxy("myproxy.mydomain.com", 8080); proxy.Credentials = new NetworkCredential("username", "password", "mydomain"); rqst.Proxy = proxy; rqst.Method = "POST"; if (!String.IsNullOrEmpty(postdata)) { rqst.ContentType = "application/x-www-form-urlencoded"; byte[] byteData = Encoding.UTF8.GetBytes(postdata); rqst.ContentLength = byteData.Length; using (Stream postStream = rqst.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); postStream.Close(); } } ((HttpWebRequest)rqst).KeepAlive = false; StreamReader rsps = new StreamReader(rqst.GetResponse().GetResponseStream()); string strRsps = rsps.ReadToEnd(); return strRsps; } 

问题是,当调用GetRequestStream时,我不断收到WebException,并显示消息"The remote server returned an error: (502) Bad Gateway."

起初我认为它与SSL证书validation有关。 所以我添加了这一行:

 ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); 

哪里

 public class AcceptAllCertificatePolicy : ICertificatePolicy { public bool CheckValidationResult(ServicePoint srvPoint, System.Security.Cryptography.X509Certificate certificate, WebRequest request, int certificateProblem) { return true; } } 

而且我一直得到同样的502错误。 有任何想法吗?

阅读错误响应的实体主体。 它可能会暗示正在发生的事情。

执行此操作的代码如下:

 catch(WebException e) { if (e.Status == WebExceptionStatus.ProtocolError) { WebResponse resp = e.Response; using(StreamReader sr = new StreamReader(resp.GetResponseStream())) { Response.Write(sr.ReadToEnd()); } } } 

这应该显示错误响应的全部内容。

在此帮助下,我得到了一个更详细的问题描述:代理返回了消息:“ 用户代理无法识别 。” 所以我手动设置它。 此外,我更改了代码以使用GlobalProxySelection.GetEmptyWebProxy (),如此处所述。 最终的工作代码包含在下面。

 private static string SendRequest(string url, string postdata) { if (String.IsNullOrEmpty(postdata)) return null; HttpWebRequest rqst = (HttpWebRequest)HttpWebRequest.Create(url); // No proxy details are required in the code. rqst.Proxy = GlobalProxySelection.GetEmptyWebProxy(); rqst.Method = "POST"; rqst.ContentType = "application/x-www-form-urlencoded"; // In order to solve the problem with the proxy not recognising the user // agent, a default value is provided here. rqst.UserAgent = "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)"; byte[] byteData = Encoding.UTF8.GetBytes(postdata); rqst.ContentLength = byteData.Length; using (Stream postStream = rqst.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); postStream.Close(); } StreamReader rsps = new StreamReader(rqst.GetResponse().GetResponseStream()); string strRsps = rsps.ReadToEnd(); return strRsps; } 

Web服务的wsdl可能与域名和SSL证书“争论”。 IIS将使用IIS注册的域名自动生成Web服务的WSDL(默认情况下,该域名是本地域中的计算机名称,不一定是您的Web域)。 如果证书域与SOAP12地址中的域不匹配,您将收到通信错误。

UserAgent丢失了

例如:request.UserAgent =“Mozilla / 4.0(兼容; MSIE 7.0; Windows NT 5.1)”;

这种情况发生在我身上,因为如果Java应用程序没有及时响应,远程计算机上的Java代理会超时请求,从而使.NET默认超时变得毫无用处。 以下代码循环遍历所有exception并写出响应,这有助于我确定它实际来自代理:

 static void WriteUnderlyingResponse(Exception exception) { do { if (exception.GetType() == typeof(WebException)) { var webException = (WebException)exception; using (var writer = new StreamReader(webException.Response.GetResponseStream())) Console.WriteLine(writer.ReadToEnd()); } exception = exception?.InnerException; } while (exception != null); } 

代理的响应主体看起来像这样:

   502 Proxy Error  

Proxy Error

The proxy server received an invalid response from an upstream server.
The proxy server could not handle the request POST https://stackoverflow.com/xxx/xxx/xxx.

Reason: Error reading from remote server