Fehler 502 (errorshaftes Gateway) beim Senden einer Anforderung mit HttpWebRequest über SSL

Ich habe im klassischen ASP den folgenden Ausschnitt, um einen Befehl zu senden und die Antwort über SSL abzurufen:

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 

Dann habe ich diesen Code als Referenz verwendet, um die Anfrage in c # erneut zu implementieren:

 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; } 

Das Problem ist, wenn ich GetRequestStream aufrufe, bekomme ich immer eine WebException mit der Meldung "The remote server returned an error: (502) Bad Gateway."

Zuerst dachte ich, es habe mit der Überprüfung des SSL-Zertifikats zu tun. Also habe ich diese Zeile hinzugefügt:

 ServicePointManager.CertificatePolicy = new AcceptAllCertificatePolicy(); 

Woher

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

Und ich bekomme immer den gleichen 502-Fehler. Irgendwelche Ideen?

    Lesen Sie den Entitätskörper der Fehlerantwort. Es könnte einen Hinweis darauf geben, was passiert.

    Der Code dafür ist wie folgt:

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

    Das sollte den vollen Inhalt der Fehlerantwort zeigen.

    Damit habe ich eine detailliertere Beschreibung des Problems erhalten: Der Proxy gab die Nachricht zurück: ” Der Benutzeragent wird nicht erkannt .” Also habe ich es manuell eingestellt. Außerdem habe ich den Code geändert, um GlobalProxySelection.GetEmptyWebProxy () zu verwenden, wie hier beschrieben. Der endgültige Arbeitscode ist unten aufgeführt.

     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; } 

    Es ist möglich, dass der WSDL für den Webdienst mit dem Domänennamen und dem SSL-Zertifikat “streicht”. IIS generiert automatisch die WSDL eines Webdiensts unter Verwendung des registrierten IIS-Domänennamens (standardmäßig der Computername der lokalen Domäne und nicht unbedingt Ihre Webdomäne). Wenn die Zertifikatsdomäne nicht mit der Domäne in der SOAP12-Adresse übereinstimmt, werden Kommunikationserrors angezeigt.

    UserAgent fehlt

    Beispiel: request.UserAgent = “Mozilla / 4.0 (kompatibel; MSIE 7.0; Windows NT 5.1)”;

    Dies geschah für mich, weil ein Java-Proxy auf dem Remote-Rechner Anforderungen abfiel, wenn die Java-Anwendung nicht rechtzeitig reactjse, was die .NET-Standard-Zeitüberschreitungen nutzlos machte. Der folgende Code durchläuft alle Ausnahmen und schreibt die Antworten aus, mit denen ich feststellen konnte, dass er tatsächlich vom Proxy kam:

     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); } 

    Der Antworttext des Proxy sah in etwa so aus:

     < !DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">  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