wake-up-neo.net

Fehler 502 (fehlerhaftes 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 Nachricht "The remote server returned an error: (502) Bad Gateway."

Zuerst dachte ich, dass es mit der Überprüfung des SSL-Zertifikats zu tun hatte. 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?

23
Leonardo

Mit dieser Hilfe Ich habe eine detailliertere Beschreibung des Problems erhalten: Der Proxy hat die Meldung zurückgegeben: "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 beschrieben hier . 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;
}
26
Leonardo

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.

31
feroze

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 Web-Services unter Verwendung des registrierten IIS -Domänennamens (standardmäßig der Rechnername 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 Kommunikationsfehler angezeigt.

1
Joel Etherton

UserAgent fehlt

beispiel: request.UserAgent = "Mozilla/4.0 (kompatibel; MSIE 7.0; Windows NT 5.1)";

1

Dies geschah für mich, weil ein Java-Proxy auf dem Remotecomputer Anforderungen zeitlich verzögerte, wenn die Java-Anwendung nicht rechtzeitig reagierte und die .NET-Standardzeitlimits nutzlos wurden. Der folgende Code durchläuft alle Ausnahmen und schreibt die Antworten, 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">
<html><head>
<title>502 Proxy Error</title>
</head><body>
<h1>Proxy Error</h1>
<p>The proxy server received an invalid
response from an upstream server.<br />
The proxy server could not handle the request <em><a href="/xxx/xxx/xxx">POST&nbsp;/xxx/xxx/xxx</a></em>.<p>
Reason: <strong>Error reading from remote server</strong></p></p>
</body></html>
0
Alexandru