Xamarin iOS中的WCF:为服务操作调用添加HTTP标头

时间:2014-07-08 09:26:18

标签: wcf xamarin.ios

每次iOs客户端调用WCF服务时,我都想添加带有用户令牌的HTTP标头。我发现两种方式或多或少透明:通过WebOperationContextIClientMessageInspector的实现。但是,这些都没有为我工作。

我无法通过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标头的方法吗?

1 个答案:

答案 0 :(得分:0)

我决定使用邮件头而不是HTTP头。它非常适合我的目的,我不需要在可移植类库中不可用的WebOperationContext。 操作代码非常简单。

using (new OperationContextScope((DataServiceClientChannel)Channel))
{
    MessageHeader mhead = MessageHeader.CreateHeader("member.token", "", userToken);
    OperationContext.Current.OutgoingMessageHeaders.Add(mhead);
    result = Channel.GetData();
}