2013-09-24 9 views
8

Ich versuche, eine benutzerdefinierte Soap-Headerinformationen in C# vor dem Aufruf eines Webdienstes hinzuzufügen. Ich verwende die SOAP-Header-Klasse, um dies zu erreichen. Ich könnte das teilweise, aber nicht ganz so machen, wie ich es brauche. Hier ist, wie ich die SOAP-Header muß aussehenHinzufügen von benutzerdefinierten SOAPHeader in C# für einen Webdienstanruf

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header> 
     <Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <UsernameToken> 
     <Username>USERID</Username> 
     <Password>PASSWORD</Password> 
     </UsernameToken>  
     </Security> 
    </soap:Header> 
    <soap:Body> 
    ... 

Ich bin in der Lage Seife Header, wie unten

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
    <soap:Header> 
     <UsernameToken xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd"> 
     <Username>UserID</Username> 
     <Password>Test</Password> 
     </UsernameToken> 
    </soap:Header> 
    <soap:Body> 

Was ich bin nicht in der Lage hinzuzufügen ist, um die „Sicherheit“ Elemente zu tun hinzufügen, die Wraps das "UsernameToken" wie im ersten Beispiel. Jede Hilfe wäre willkommen.

Antwort

1

Dieser Link adding soap header arbeitete für mich. Ich rufe einen SOAP 1.1-Dienst an, den ich nicht geschrieben habe und den ich nicht kontrollieren kann. Verwende VS 2012 und fügte den Dienst als Web-Referenz in meinem Projekt hinzu. Hoffe, das hilft

Ich folgte den Schritten 1-5 von J. Dudgeon's Post in Richtung der Unterseite des Threads.

Hier einige Beispiel-Code (das in einer separaten CS-Datei wäre):

namespace SAME_NAMESPACE_AS_PROXY_CLASS 
{ 
    // This is needed since the web service must have the username and pwd passed in a custom SOAP header, apparently 
    public partial class MyService : System.Web.Services.Protocols.SoapHttpClientProtocol 
    { 
     public Creds credHeader; // will hold the creds that are passed in the SOAP Header 
    } 

    [XmlRoot(Namespace = "http://cnn.com/xy")] // your service's namespace goes in quotes 
    public class Creds : SoapHeader 
    { 
     public string Username; 
     public string Password; 
    } 
} 

Und dann in der Klasse generierten Proxy, über die Methode, die den Dienst aufruft, pro Schritt des J Dudgeon 4 dieses Add Attribut: [SoapHeader("credHeader", Direction = SoapHeaderDirection.In)]

schließlich, hier ist der Aufruf der Methode generierte Proxy, mit dem Header:

using (MyService client = new MyService()) 
{ 
    client.credHeader = new Creds(); 
    client.credHeader.Username = "username"; 
    client.credHeader.Password = "pwd"; 
    rResponse = client.MyProxyMethodHere(); 
} 
+0

Jede Chance von Beispielcode bereitstellt? Danke im Voraus. (Ich schaue auf Link/Schritte und versuche, seine Frage mit seinem/Dudgeons Beispielcode in Einklang zu bringen, aber nicht direkt korrespondierend/klickend mit mir auf die Frage, wie man für die Sicherheitskopffeldanforderung übersetzt). – Terry

+1

Siehe oben. Ich habe einen Beispielcode hinzugefügt. Hoffe, dass hilft –

+0

übrigens - das ist kein WCF-Service, wahrscheinlich das ist offensichtlich für einige –