2013-09-24 7 views
8

Sto tentando di aggiungere un'intestazione di sapone personalizzata in C# prima di chiamare un servizio web. Sto usando la classe SOAP Header per ottenere questo risultato. Potrei farlo parzialmente ma non completamente nel modo in cui ne ho bisogno. Ecco come ho bisogno l'intestazione di sapone a guardare comeAggiunta SOAPHeader personalizzata in C# per una chiamata al servizio Web

<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> 
    ... 

Sono in grado di aggiungere un'intestazione sapone come di seguito

<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> 

Quello che non sono in grado di fare è aggiungere gli elementi "di sicurezza" che avvolge il "UsernameToken" come nel primo esempio. Qualsiasi aiuto sarebbe apprezzato.

risposta

1

Questo collegamento adding soap header ha funzionato per me. Sto chiamando un servizio SOAP 1.1 che non ho scritto e non ho alcun controllo. Sto usando VS 2012 e ho aggiunto il servizio come riferimento web nel mio progetto. Spero che questo aiuti

Ho seguito i passaggi 1-5 dal post di J. Dudgeon verso il fondo del thread.

Ecco alcuni esempi di codice (questo sarebbe in un file .cs separato):

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; 
    } 
} 

E poi nella classe proxy generato, sul metodo che chiama il servizio, per ogni passo di J Dudgeon 4 aggiungere questo attributo: [SoapHeader("credHeader", Direction = SoapHeaderDirection.In)]

finalmente, ecco la chiamata al metodo proxy generato, con l'intestazione:

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

Ogni possibilità di fornire il codice di esempio? Grazie in anticipo. (Sto guardando link/steps, e sto cercando di conciliare la sua domanda con il codice di esempio di/Dudgeon, ma non direttamente corrispondente/facendo clic con me su come tradurre per i requisiti dell'intestazione di sicurezza). – Terry

+1

Vedi sopra ho aggiunto qualche codice di esempio. Spero che questo aiuti –

+0

- questo non è un servizio WCF, probabilmente è ovvio ad alcuni –