通过通道

时间:2016-02-26 12:25:27

标签: c# wcf

我有一个WCF服务,需要将应用程序ID参数传递给每个服务调用。目前我暴露的方法需要一个参数。我想尝试将此信息推送到Channel标头中。我的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中我得到了这个:

There is no HttpRequestMessageProperty on the incoming Message.

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

1 个答案:

答案 0 :(得分:4)

您使用的是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());
     }
}