2009-12-29 16 views
26

Posso aggiungere un'intestazione SOAP personalizzata nei messaggi in entrata/uscita WCF in basicHttpBinding, come se fosse possibile aggiungere un'intestazione di autenticazione personalizzata nei servizi Web ASMX? Tali intestazioni SOAP personalizzate devono essere accessibili utilizzando i client di servizio Web .net 2.0/1.1 (accessibili dallo strumento WSDL.EXE).Come aggiungere intestazioni di sapone personalizzate in wcf?

+0

aggiornato la mia risposta con informazioni sugli ispettori di messaggi –

+0

aggiornato la mia risposta di nuovo con informazioni sull'interoperabilità ASMX/WCF per quanto riguarda SOAP headesr –

+0

grazie marc_s, questo sembra buono, lo proverò. – nRk

risposta

26

Controlla il WCF Extras su Codeplex - è una libreria di estensioni facile per WCF che offre, tra le altre cose, intestazioni SOAP personalizzate.

Un'altra opzione è quella di utilizzare WCF message contracts nel servizio WCF; in questo modo è anche possibile definire e impostare le intestazioni SOAP WCF.

[MessageContract] 
public class BankingTransaction 
{ 
    [MessageHeader] 
    public Operation operation; 
    [MessageHeader] 
    public DateTime transactionDate; 

    [MessageBodyMember] 
    private Account sourceAccount; 
    [MessageBodyMember] 
    private Account targetAccount; 
    [MessageBodyMember] 
    public int amount; 
} 

Qui "l'operazione" e "transactionDate" sono definiti come intestazioni SOAP.

Se nessuno di questi metodi è di aiuto, è necessario verificare il concetto di Message Inspector WCF che è possibile scrivere come estensioni. Ti consentono di es. inserire determinate intestazioni nel messaggio su ogni chiamata in uscita sul client e recuperarle dal messaggio sul server per l'uso.

Vedere questo post del blog Handling custom SOAP headers via WCF Behaviors per un punto di partenza su come scrivere un ispettore di messaggi e come includerlo nella configurazione del progetto.

Il lato client IClientMessageInspector definisce due metodi BeforeSendRequest e AfterReceiveReply mentre il lato server IDispatchMessageInspector ha metodi opposti, cioè AfterReceiveRequest e BeforeSendReply.

Con questo, è possibile aggiungere intestazioni a ogni messaggio che passa attraverso il filo (o selettivamente solo a pochi).

Ecco un frammento da un IClientMessageInspector implementazioni che usiamo per trasmettere automagicamente le informazioni internazionali (lingua e informazioni cultura) di fronte client al server - dovrebbe darvi un'idea di come iniziare:

public object BeforeSendRequest(ref Message request, IClientChannel channel) 
{ 
    International intlHeader = new International(); 
    intlHeader.Locale = CultureInfo.CurrentUICulture.TwoLetterISOLanguageName; 

    MessageHeader header = MessageHeader.CreateHeader(WSI18N.ElementNames.International, WSI18N.NamespaceURI, intlHeader); 
    request.Headers.Add(header); 

    return null; 
} 

Sul lato server, si dovrebbe quindi verificare la presenza di quelle intestazioni e, se presenti, estrarle dalla busta SOAP e usarle.

UPDATE: va bene, sei clienti sono in .NET 2.0 e non utilizzando WCF - buona notizia è, questo dovrebbe ancora funzionare bene - vedere questo post del blog Custom SOAP Headers: WCF and ASMX per i dettagli. È comunque possibile utilizzare l'ispettore messaggi sul lato server per sniffare ed estrarre le intestazioni personalizzate inviate dai client .NET 2.0.

+0

Grazie a marc_s, ho provato a noi WCF Extras, ho aggiunto l'attributo "XmlSerializerFormat" al contratto di servizio WCF Extra lanciare un errore durante l'accesso ai servizi. Esiste un'altra soluzione disponibile come WCF Extras? Posso aggiungere MessageContract come attributo a tutti i metodi come ho aggiunto SoapHeader nei servizi ASMX? Il mio requisito è che ho bisogno di inviare alcuni dati (lo stesso dicono username e password) per ogni chiamata al servizio WCF. C'è un modo per implementare questo? – nRk

+0

yah marc_s, sembra fantastico. ma nell'articolo menzionato il client dovrebbe essere in .net 3.0 o successivo ... ma nel mio caso i client sono in .net 2.0 e 1.1. È ancora possibile implementare questo? – nRk

Problemi correlati