使用 WCF 操作上下文通过通道传递标头值

本文关键字:通道 操作 WCF 操作上 上下文 使用 | 更新日期: 2023-09-27 18:36:25

我有一个 WCF 服务,它要求将应用程序 ID 参数传递给每个服务调用。目前我公开的方法需要一个参数。我想尝试将此信息推送到通道标头中。我的 WCF 是使用 Net.tcp 托管的。这是我的客户代理代码:

public class CustomerClient : ClientBase<ICustomerBrowser>, ICustomerBrowser
{
  public Customer Get(string ApplicationID, string CustomerId)
  {
    try
    {
        using (OperationContextScope _scope = new OperationContextScope(this.InnerChannel))
        {
            MessageHeader _header = MessageHeader.CreateHeader("AppID", string.Empty, ApplicationId);
            OperationContext.Current.OutgoingMessageHeaders.Add(_header);
            return Channel.Get(ApplicationId, CustomerId);
            // return Channel.Get(CustomerId);
        }
    }
  }
}

(注释掉的行是我想继续使用的)。

服务器代码:

var _context = WebOperationContext.Current;
var h = _context.IncomingRequest.Headers;

_context 对象中,有一些私有方法包含我的标头,但在_context.IncomingRequest.Headers中我公开得到这个:

传入消息上没有 HttpRequestMessageProperty。

所以我的问题是,我是否因为没有在HTTP上托管而受苦?有没有办法通过添加一些伪 HTTP 标头来欺骗服务器让我访问这些标头?或者我可以通过反思来了解私人成员?

使用 WCF 操作上下文通过通道传递标头值

您使用了错误的OperationContext实例。

WebOperationContext专门用于通过 http 传输的邮件。它希望其标头具有指定名称。对于WebOperationContext,MessageHeaders 字典需要一个名为 httpRequest 的键,你的方案中未提供该键。

当您使用标准OperationContext客户端时,客户端应执行相同的服务器端:

var _context = OperationContext.Current;
var headers = _context.IncomingMessageHeaders; 
foreach (MessageHeaderInfo h in headers)
{
     if (h.Name == "AppID") {
        Debug.WriteLine(h.ToString());
     }
}