查看 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;
}
这里,“操作”和“事务日期”被定义为 SOAP 标头。
如果这些方法都没有帮助,那么您应该查看 WCF 消息检查器的概念,您可以将其编写为扩展。它们允许您例如在客户端的每次传出呼叫时将某些标头注入到消息中,并从服务器上的消息中检索这些标头以供您使用。
请参阅此博客文章 Handling custom SOAP headers via WCF Behaviors,了解如何编写消息检查器以及如何将其包含在项目设置中。
客户端IClientMessageInspector定义了两个方法BeforeSendRequest和AfterReceiveReply,而服务端IDispatchMessageInspector有相反的方法,即AfterReceiveRequest和BeforeSendReply。
有了这个,您可以为通过网络的每条消息添加标头(或选择性地仅添加到少数)。
这是来自 IClientMessageInspector 实现者的 sn-p,我们使用它自动将区域设置信息(语言和文化信息)从客户端传输到服务器 - 应该让您知道如何开始:
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;
}
在服务器端,您将检查这些标头是否存在,如果存在,则从 SOAP 信封中提取它们并使用它们。
更新:好的,您的客户使用 .NET 2.0 并且不使用 WCF - 好消息是,这应该仍然可以正常工作 - 请参阅此博客文章Custom SOAP Headers: WCF and ASMX 了解详情。您仍然可以使用服务器端的消息检查器来嗅探和提取 .NET 2.0 客户端发送的自定义标头。