每次iOs客户端调用WCF服务时,我都想添加带有用户令牌的HTTP标头。我发现两种方式或多或少透明:通过WebOperationContext
和IClientMessageInspector
的实现。但是,这些都没有为我工作。
我无法通过IEndpointBehavior.ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime)
将消息检查器绑定到端点,因为属性ClientRuntime.ClientMessageInspectors会抛出NotImplementedException。
WebOperationContext对我也没有帮助。以下Windows控制台应用程序代码运行良好,标题由服务读取。
var channelFactory = new ChannelFactory<IDataService>(binding, endPointAddress);
IDataService client = channelFactory.CreateChannel();
using (new OperationContextScope((IClientChannel)client))
{
WebOperationContext woc = new WebOperationContext(OperationContext.Current);
woc.OutgoingRequest.Headers["X-Test42"] = "header value";
var data = client.GetData();
}
iO的代码略有不同,因为我无法使用ChannelFactory进行动态代理生成。我创建了ClientBase<IDataService>
和ClientBase<IDataService>.ChannelBase<IDataService>
的实现
https://stackoverflow.com/a/10056431/456181
属性DataServiceClient.ContextChannel返回ClientBase<IDataService>.ChannelBase<IDataService>
。
DataServiceClient client = new DataServiceClient(binding, endPointAddress);
using (new OperationContextScope(client.ContextChannel))
{
WebOperationContext woc = new WebOperationContext(OperationContext.Current);
woc.OutgoingRequest.Headers["X-Test42"] = "header value";
var data = client.GetData();
}
标题&#34; X-Test42&#34;没有到达WCF服务。
有人可以建议如何调整这两种方法中的任何一种或任何其他添加HTTP标头的方法吗?
答案 0 :(得分:0)
我决定使用邮件头而不是HTTP头。它非常适合我的目的,我不需要在可移植类库中不可用的WebOperationContext
。
操作代码非常简单。
using (new OperationContextScope((DataServiceClientChannel)Channel))
{
MessageHeader mhead = MessageHeader.CreateHeader("member.token", "", userToken);
OperationContext.Current.OutgoingMessageHeaders.Add(mhead);
result = Channel.GetData();
}