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

nRk*_*nRk 26 wcf wcf-client

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

mar*_*c_s 26

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

另一种选择是在WCF服务中使用WCF消息协定 - 这也可以轻松地定义和设置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;
}
Run Code Online (Sandbox Code Playgroud)

这里,"operation"和"transactionDate"被定义为SOAP头.

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

请参阅此博客文章通过WCF行为处理自定义SOAP标头,以获取有关如何编写消息检查器的起点,以及如何将其包含在项目设置中.

客户端IClientMessageInspector定义了两种方法BeforeSendRequest,AfterReceiveReply而服务器端则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;
}
Run Code Online (Sandbox Code Playgroud)

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

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