【发布时间】:2009-06-12 12:46:59
【问题描述】:
通过定义一个实现 IContactBehavior 和 IWsdlExportExtension 的属性并在您的服务合同上设置该属性,您可以轻松地将 Soap 标头添加到您的 wsdl(有关更多信息,请参阅http://wcfextras.codeplex.com/)
但是现在我需要在所有 Operationcontracts 的 wsdl 中设置 Soap Header 合约,而这一次我无法设置属性。
以下代码(从 IWsdlExportExtension.ExportEndPoint 调用)不起作用,但在从 SoapHeaderAttributes(执行 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;
}
任何人都知道如何将此代码应用于所有操作(不使用属性)并通过这样做,将标头的合同添加到 wsdl 中?
【问题讨论】: