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

最佳答案

在Codeplex上查看WCF Extras-这是WCF的简单扩展库,除其他功能外,它还提供自定义SOAP header 。

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

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

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

在此,“操作”和“transactionDate”被定义为SOAP头。

如果这些方法都无济于事,那么您应该检查一下WCF消息检查器的概念,您可以将其编写为扩展。他们允许您例如在客户端上的每个拨出 call 中,将某些 header 注入(inject)消息中,并从服务器上的消息中检索这些 header 供您使用。

有关如何编写消息检查器以及如何将其包括在项目设置中的起点,请参见此博客文章Handling custom SOAP headers via WCF Behaviors

客户端IClientMessageInspector定义了两种方法BeforeSendRequestAfterReceiveReply,而服务器端IDispatchMessageInspector具有相反的方法,即AfterReceiveRequestBeforeSendReply

这样,您可以将标题添加到通过网络传输的每条消息中(或选择性地仅添加到一些消息中)。

这是一个IClientMessageInspector实现程序的片段,我们用来自动地将语言环境信息(语言和文化信息)从客户端传输到服务器-应该给您一个入门的思路:
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;
}

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

更新:好的,您的客户端使用的是.NET 2.0,而不是使用WCF的,而不是-好消息是,它仍然可以正常工作-有关详细信息,请参见此博客文章Custom SOAP Headers: WCF and ASMX。您仍然可以在服务器端使用消息检查器来嗅探并提取由.NET 2.0客户端发送的自定义 header 。

关于wcf - 如何在wcf中添加自定义的肥皂标题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1976217/

10-16 22:03