65.9K
CodeProject 正在变化。 阅读更多。
Home

为 WCF 通道添加自定义标头

starIconstarIcon
emptyStarIcon
starIcon
emptyStarIconemptyStarIcon

2.38/5 (9投票s)

2009年6月3日

CPOL

1分钟阅读

viewsIcon

86937

本文档描述了如何向 WCF 通道添加自定义头部以及如何使用它们。

引言

在设计基于 WCF 的 SOA 服务时,我们经常遇到需要从客户端到服务重复传递一些信息的需求。

一个例子是用户身份信息,例如用户 ID 或客户端应用程序标识符。WCF 服务需要用户 ID 信息用于日志记录。因此,对于每个方法调用,您都必须传递该信息。

一种方法是将其作为额外的请求参数传递。但是,每个方法调用都需要重复包含此参数。这不是一个非常干净的解决方案。此外,如果此参数的数据类型发生更改,则所有方法签名及其调用都需要更改。

处理此需求的更好方法是将此信息添加到 WCF 通道头部。

动手编码

首先,我们将自定义头部添加到代理构造函数中。(希望您没有使用 Visual Studio 生成代理,否则下次生成时您的代码将会丢失。使用 Visual Studio 生成代理在您创建服务时最初是可以的。您不必为服务的每次更改都这样做。转到代理类并手动执行它非常简单。)

using System.ServiceModel;
using System.ServiceModel.Channels;

public partial class ZipServiceClient : 
       System.ServiceModel.ClientBase<IZipService>, IZipService
{
    //Proxy constructor
    public ZipServiceClient()
    {
        //Add basic information to the custom header
        AddCustomHeaderUserInformation(
           new OperationContextScope(base.InnerChannel));
    }
    
    // Scope is being passed. Note - If you have multiple service, you can move
    // this method to a common static class.
    // That way you would not have to same code all the proxy files.
    private static void AddCustomHeaderUserInformation(
                                 OperationContextScope scope)
    {
        //Add the basic userId
        MessageHeader<int> customHeaderUserID = 
          new MessageHeader<int>(<State.UserIDToken>);
        MessageHeader untypedHeaderUserID = 
          customHeaderUserID.GetUntypedHeader("UserID", 
          "CustomHeader");
}

这里的用户 ID 从 State(session) 读取。您需要将其替换为您存储信息的位置。接下来,我们将读取服务中的头部。

using System.Runtime.Serialization;
using System.ServiceModel; 

 // Read the headers 

int userID = 
  OperationContext.Current.IncomingMessageHeaders.GetHeader<int>(
  "UserID", "CustomHeader");

注意:这些头部在 WCF 服务之后的所有地方都可用。您可以在服务实现代码和服务的后端层中访问它们。

就这样。非常简单明了。我希望我没有遗漏任何细节。如果您有任何问题,请给我发电子邮件。

© . All rights reserved.