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.
Wie kann ich diese beiden Felder beeinflussen?
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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 😃