2016-09-08 2 views
-2

Der C# -Code sieht wie folgt aus:Übersetzen C# SOAP Beitrag Anfrage an PHP SOAP Beitrag anfordern

private static string SendSoapRequest(string request, string destinationUrl) 
    { 
     string soapRequest = String.Format("<?xml version=\"1.0\" encoding=\"utf-8\"?>" + 
              "<soap:Envelope xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" " + 
              "soap:encodingStyle=\"http://schemas.xmlsoap.org/soap/encoding/\">" + 
              "<soap:Body>{0}</soap:Body></soap:Envelope>", request); 

     HttpWebRequest req = (HttpWebRequest) WebRequest.Create(destinationUrl); 

     byte[] buffer = Encoding.UTF8.GetBytes(soapRequest); 

     req.Method = "POST"; 
     req.ContentType = "application/soap+xml"; 
     req.ContentLength = buffer.Length; 

     req.CookieContainer = new CookieContainer(); // enable cookies 
     req.Referer = "localhost"; 
     req.Credentials = CredentialCache.DefaultCredentials; 

     Stream reqst = req.GetRequestStream(); // add form data to request stream 
     reqst.Write(buffer, 0, buffer.Length); 
     reqst.Flush(); 
     reqst.Close(); 

     HttpWebResponse res = (HttpWebResponse) req.GetResponse(); 

     Stream responseStream = res.GetResponseStream(); 
     if (responseStream != null) 
     { 
      StreamReader sr = new StreamReader(responseStream); 
      string response = sr.ReadToEnd(); 
      return response; 
     } 

     return string.Empty; 
    } 

Und meine Bemühungen so weit, unter vielen anderen Variationen in PHP wihtout Erfolg:

public static function sendSoapCurl($samlMessage, $destination, $action) { 

    $headers = array(
     "Content-type: application/soap+xml;charset=\"utf-8\"", 
     "Content-length: ".strlen($samlMessage), 
    ); 

    if (isset($action)) { 
     $headers[] = "SOAPAction: $action"; 
    } 

    // $samlMessage = utf8_encode($samlMessage); 

    // PHP cURL for https connection with auth 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
    curl_setopt($ch, CURLOPT_URL, $destination); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
    curl_setopt($ch, CURLOPT_TIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_POST, true); 
    curl_setopt($ch, CURLOPT_POSTFIELDS, $samlMessage); // the SOAP request 

    curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); 

    // get soap response 
    $soapresponsexml = curl_exec($ch); 
    $httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 
    curl_close($ch); 

    if ($httpCode != 200) { 
     print_r("Status code: ".$httpCode."\n"); 
     print_r($soapresponsexml);exit(); 
    } 

    if ($soapresponsexml === null || $soapresponsexml === "") { 
     throw new \Exception('Empty SOAP response, check peer certificate.'); 
    } 

    try { 
     $dom = new DOMDocument(); 
     $dom = OneLogin_Saml2_Utils::loadXML($dom, $soapresponsexml); 
    } catch (RuntimeException $e) { 
     throw new \Exception('Not a SOAP response.', 0, $e); 
    } 
    $soapfault = self::getSOAPFault($dom); 
    if (isset($soapfault)) { 
     throw new \Exception($soapfault); 
    } 
} 

Der C# -Code funktioniert, aber ich kann es nicht in PHP arbeiten. Irgendwelche Ideen werden sehr geschätzt. Vielen Dank.

+0

Was * genau * funktioniert nicht? Bitte teilen Sie Ihre Forschungsanstrengungen. Bitte geben Sie weitere Erläuterungen zu Ihrem Code, zu dem, was Sie versuchen, und zu dem Problem, das Sie erfahren. Es ist schwierig, einen Fehler in Dutzenden oder sogar Hunderten von Codezeilen zu finden. Siehe auch [Wie erstelle ich ein * minimales *, vollständiges und verifizierbares Beispiel] (http://stackoverflow.com/help/mcve) und [Wie stelle ich eine gute Frage?] (Http://stackoverflow.com)/Hilfe/wie man fragt). –

+0

Danke, war an einer reinen Übersetzung von C# nach PHP interessiert. Es stellt sich heraus, dass das Stück, das mir fehlte, utf8 war, das die SOAP-Anfrage kodierte, wodurch das Problem gelöst wurde - utf8_encode ($ soapRequest). – suthers

Antwort

0

In der Übersetzung fehlte mir der utf8 Kodierungsteil. Das Hinzufügen der Zeile unten löste mein Problem und die Anfrage funktioniert jetzt:

$soapUtf8Request = utf8_encode($samlMessage);