【问题标题】:Message headers sent on webservice calls on portable libraries (PCL)在可移植库 (PCL) 上的 Web 服务调用上发送的消息头
【发布时间】:2014-03-19 19:18:17
【问题描述】:

我正在尝试将我对 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,它本身就错过了它们。

【问题讨论】:

  • 您使用什么技术为客户提供服务?
  • @Justin 假设它是 Windows 服务器上的 .Net 4.5。为什么这很重要?
  • 顺便说一句,我有兴趣在 PCL 中实现这一点,该 PCL 也将针对 Xamarin.Android,而不仅仅是 Windows 平台。我可以通过抽象逻辑来解决这个问题,就像我对其他所有平台特定的东西所做的那样,但是一个通用的平台无关解决方案会更好。
  • 不是框架,而是您使用什么来为客户创建服务? WCF?
  • @Justin 是的,WCF 客户端正在使用 WCF 服务。

标签: portable-class-library request-headers


【解决方案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
}

之后,您应该能够使用OperationContext.CurrentIncomingMessageHeaders 属性获取标头。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-04
    • 2013-12-14
    • 2012-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多