我有一个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标头让我访问这些标头?或者我可以通过反思获得私人会员吗?
答案 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());
}
}