WCF WSDL Soap Header on all operations

Jun 12, 2009 at 1:01 PM

By defining an attribute that implements IContactBehavior and IWsdlExportExtension and set that attribute on your service contract, you can easily add Soap Headers to your wsdl thanks to WCFExtras.

But now I need to set a Soap Header on all Operationcontracts and this time I cannot set an attribute.

Following code (called from IWsdlExportExtension.ExportEndPoint) doesn't work, but does work when called from the SoapHeaderAttributes (that executes an IWsdlExportExtension.ExportContract):

foreach (OperationDescription operationDescription in context.ContractConversionContext.Contract.Operations)
{
   AddSoapHeader(operationDescription, "SomeHeaderObject", typeof(SomeHeaderObject), SoapHeaderDirection.InOut);                    
}
internal static void AddSoapHeader(OperationDescription operationDescription, string name, Type type, SoapHeaderDirection direction)
{
        MessageHeaderDescription header = GetMessageHeader(name, type);
        bool input = ((direction & SoapHeaderDirection.In) == SoapHeaderDirection.In);
        bool output = ((direction & SoapHeaderDirection.Out) == SoapHeaderDirection.Out);

        foreach (MessageDescription msgDescription in operationDescription.Messages)
        {
                if ((msgDescription.Direction == MessageDirection.Input && input) ||
                        (msgDescription.Direction == MessageDirection.Output && output))
                        msgDescription.Headers.Add(header);
        }
}

internal static MessageHeaderDescription GetMessageHeader(string name, Type type)
{
        string headerNamespace = SoapHeaderHelper.GetNamespace(type);
        MessageHeaderDescription messageHeaderDescription = new MessageHeaderDescription(name, headerNamespace);
        messageHeaderDescription.Type = type;
        return messageHeaderDescription;
}
Anyone has an idea how to apply this code on all operations (without using attributes) ?