En définissant un attribut qui implémente IContactBehavior et IWsdlExportExtension et définissez cet attribut sur votre contrat de service, vous pouvez facilement ajouter têtes de savon à votre wsdl (voir http://wcfextras.codeplex.com/ pour plus d'informations)WCF WSDL savon en-tête sur toutes les opérations
Mais maintenant je dois placer un contrat d'en-tête de savon dans le wsdl sur tous les contrats d'opération et cette fois je ne peux pas placer un attribut.
code suivant (appelé de IWsdlExportExtension.ExportEndPoint) ne fonctionne pas, mais fonctionne lorsqu'il est appelé à partir des SoapHeaderAttributes (qui exécute un 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;
}
Toute personne a une idée comment appliquer ce code sur toutes les opérations (sans utiliser d'attributs) et en faisant cela, en ajoutant le contrat de l'en-tête au wsdl?
Vous avez une boucle 'foreach MessageDescription' dans' ApplyDispatchBehavior() 'et' AddSoapHeader() '. Je crois que celui de 'ApplyDispatchBehavior()' devrait être supprimé. – Constantin