7

我正在尝试将我对 web 服务的所有调用移动到我刚刚创建的可移植类库 (PCL) 以组织和重用我的代码。我的目标框架是适用于 Windows 应用商店应用程序的 .NET;.NET 框架 4.5;Silverlight 4 及更高版本和 WP7 及更高版本。

在我的 Win RT 项目中,我一直在通过实现命名空间 System.ServiceModel.Dispatcher 中可用的 IClientMessageInspector 接口来设置消息头。但是在我的 PCL 项目中,该接口以及 System.ServiceModel.Description.IEndpointBehavior 不可用。

因此,我需要了解如何将消息头/服务头附加到来自 PCL 项目的具有这些目标框架的服务调用中。有人有我应该尝试的经验和/或建议吗?

更新

只是为了添加更多信息,我现在尝试创建一个 WP8 项目,并注意到这些接口也不适用于它。所以 IClientMessageInspector 和 IEndpointBehavior 可能不适用于我的 PCL 项目,因为它的目标是 WP8,它本身就错过了它们。

4

1 回答 1

1

您应该能够将范围限定为OperationContext要使用的当前客户端频道:

using(var scope = new OperationContextScope(_client.InnerChannel)){
    //More to come
}

现在您已经为您的客户端通道创建了操作上下文,您可以添加传出消息头:

using(var scope = new OperationContextScope(_client.InnerChannel)){
    var header = MessageHeader.CreateHeader("x-client-type", "http://www.myapp.com", "WP8");

    OperationContext.Current.OutgoingMessageHeaders.Add(header);

    //Send message to server
}

之后,您应该能够IncomingMessageHeaders使用OperationContext.Current.

这些都是 WCF 服务的核心部分,所以它应该是可用的(希望如此)。

Mono 确实支持 WCF 服务,但您必须检查它们已实现的内容。EG:也许他们没有MessageHeader.Create,您必须使用var header = new MessageHeader<string>("x-client-type");andvar untypedHeader = header.GetUntypedHeader("x-client-type", "http://www.myapp.com");来创建要添加的标题。

于 2014-07-11T14:27:43.450 回答