Laden...

WSA-Header eines Requests bei Zugriff auf SOAP-Service stimmt an manchen Stellen nicht

Erstellt von MysticEmpires vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.219 Views
M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 7 Jahren
WSA-Header eines Requests bei Zugriff auf SOAP-Service stimmt an manchen Stellen nicht

Hi,

ich versuche grade auf einen Webservice zuzugreifend er WS-Adressing erfodert. Ich habe die WSDL eingebunden und versuche mit einem simplen WSHttpBinding auf den Service zuzugreifen:

var binding = new WSHttpBinding(SecurityMode.Transport);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

Mein genertierter Request sieht dann in etwa so aus:

<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
  <s:Header>
      <a:Action s:mustUnderstand="1"/>
      <a:MessageID>urn:uuid:85e88a4a-4569-4c90-b35c-e465c72f9925</a:MessageID>
      <a:ReplyTo>
        <a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
      </a:ReplyTo>
      <a:To s:mustUnderstand="1">https://EndPointServer123/services</a:To>
  </s:Header>
  <s:Body xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
      <ProcessAliveTest xmlns="http://xmldefs......" />
  </s:Body>
</s:Envelope>

Jedoch hat der Server 2 Probleme mit dem Header des Requests.

  • unter a:To steht aktuell der von mir definierte Endpoint. Der Server hätte hier aber gern einen Link aller "ws://..."
  • a:Action wird leider nicht mit einem "http://xmldefs..." link gefüllt

Wie kann ich diese beiden Felder beeinflussen?

16.807 Beiträge seit 2008
vor 7 Jahren

Deine Adresse sollte eigentlich unter <wsa:From> stehen. Wohin es geht sollte <wsa:To> beschreiben.

<wsa:ReplyTo> sollte ebenfalls Deine Adresse sein, sofern Du die Antworten auf Deine Anfragen verarbeitest; nicht irgendein w3c-Pfad.

Vielleicht reagiert der Webservice falsch, weil Du ihm ein ungültiges ReplyTo gibst; oder die Gegenstelle ist suboptimal implementiert.

M
MysticEmpires Themenstarter:in
302 Beiträge seit 2004
vor 7 Jahren

Die Frage ist wie kommt das a:ReplyTo den zustande? Es ist ja nicht so das ich das definiert hätte. Ich habe das ganze ja auch per SOAPUi getestet. ReplyTo wird vom Server garnicht erwartet. To,Action and MessageID sind die einzigen die er benötigt.

Mein Code ist sehr rudimentär:

var binding = new WSHttpBinding(SecurityMode.Transport);
binding.Security.Transport.ClientCredentialType = HttpClientCredentialType.Certificate;

var entpointAddr = new EndpointAddress("https://EndPoint123/services");

using (var client = new DocumentManagementServicePortTypeClient(binding, entpointAddr))
{
    client.ClientCredentials.UserName.UserName = "User123";
    client.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.LocalMachine, StoreName.My, X509FindType.FindByThumbprint, "2342424234234");

    try
    {
        var result = client.ProcessAliveTest(new ProcessAliveTestType());
    }
    catch (Exception exc)
    {
        Console.WriteLine($"Error: {exc.Message}");
    }
}

Ich gehe jetzt mal davon aus das die Gegenstelle korrekt implementiert ist. Auf den WebService habe ich selbst leider keinen Einfluss und auch keine direkt Möglichkeit Details zuerfahren wie diesen implementiert ist.

*EDIT*

Ok Action habe ich gefunden. In der Refernce.cs steht folgendes:

[System.ServiceModel.OperationContractAttribute(Action= "", ReplyAction="*")]

Dort kann ich den Wert entsprechend meiner Wünsche anpassen. Wen jetzt noch das "to"-Feld geändert werden könnte. Wäre ich glücklich 😃