2016-02-26 42 views
4

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

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); 
     } 
    } 
    } 
} 

(注释掉的线是我想要使用的前进)。

Server代码:

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

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

There is no HttpRequestMessageProperty on the incoming Message. 

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

回答

3

您正在使用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()); 
    } 
} 
+0

小学生的错误!谢谢,但是现在我面临的问题是看不到值被传递 - 我得到一个类型的System.ServiceModel.Channels.HeaderInfoCache + HeaderInfo的值,而不是MessageHeader ... –

+2

尝试'_context.IncomingMessageHeaders.GetHeader (。 ..)'方法 –

+0

完美!谢谢 –