如何在wcf中添加自定义soap标头?

时间:2009-12-29 18:47:12

标签: wcf wcf-client

我可以在basicHttpBinding中的WCF传入/传出消息中添加自定义SOAP标头,就像我们可以在ASMX Web服务中添加自定义身份验证标头一样吗?应使用.net 2.0 / 1.1 Web服务客户端(可通过WSDL.EXE工具访问)访问这些自定义SOAP标头。

2 个答案:

答案 0 :(得分:26)

查看Codeplex上的WCF Extras - 它是WCF的一个简单的扩展库,它提供了 - 除其他外 - 自定义SOAP头。

另一个选择是在WCF服务中使用WCF message contracts - 这也可以轻松地定义和设置WCF SOAP标头。

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

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

这里,“operation”和“transactionDate”被定义为SOAP头。

如果这些方法都没有帮助,那么您应该查看WCF Message Inspectors的概念,您可以将其作为扩展名编写。他们允许你例如在客户端上的每个传出呼叫中将某些标头注入到消息中,并从服务器上的消息中检索这些标头以供您使用。

请参阅此博文Handling custom SOAP headers via WCF Behaviors,了解如何撰写邮件检查器,以及如何将其包含在项目设置中。

客户端IClientMessageInspector定义了两种方法BeforeSendRequestAfterReceiveReply,而服务器端IDispatchMessageInspector具有相反的方法,即AfterReceiveRequest和{{1} }。

通过这种方式,您可以为每条通过电汇的消息添加标题(或者有选择地只添加一些消息)。

以下是BeforeSendReply实现工具的片段,我们用它来自动传输从客户端到服务器的语言环境信息(语言和文化信息) - 应该让您知道如何开始:

IClientMessageInspector

在服务器端,然后检查是否存在这些标头,如果存在,则从SOAP信封中提取它们并使用它们。

更新:没关系,你是客户使用的是.NET 2.0而使用WCF - 好消息是,这应该还可以正常工作 - 请参阅此博文Custom SOAP Headers: WCF and ASMX了解详情。您仍然可以使用服务器端的消息检查器来嗅探和提取.NET 2.0客户端发送的自定义标头。

答案 1 :(得分:1)

这个解决方案对我来说更简单:

            var client = "Your Service Client"; 
            using (var scope = new OperationContextScope(client.InnerChannel))
            {
                System.Xml.XmlDocument document = new XmlDocument();
                XmlElement element = document.CreateElement("wsse", "UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");

                XmlElement newChild = null;
                newChild = document.CreateElement("wsse", "Username", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
                newChild.InnerText = "finance";
                element.AppendChild(newChild);

                newChild = document.CreateElement("wsse", "CorporationCode", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd");
                newChild.InnerText = "387";
                element.AppendChild(newChild);

                MessageHeader messageHeader = MessageHeader.CreateHeader("UsernameToken", "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", element, false);

                OperationContext.Current.OutgoingMessageHeaders.Add(messageHeader);

                var result = client.GetCorporations(new CorporationType { pageNo = 1 });
            }