我可以在WSIT(Metro)客户端上使用WCF wsHttpContextBinding吗?
问题描述:
我正在研究WCF-WSIT(Metro)集成项目,并且希望允许Java客户端连接到持久服务。我可以在WSIT(Metro)客户端上使用WCF wsHttpContextBinding吗?
耐久服务 http://msdn.microsoft.com/en-us/library/bb410767(v=vs.90).aspx
耐用的服务需要wsHttpContextBinding,这似乎是工作的罚款。唯一的问题是,WSIT客户端生成的代理似乎无法将实例id分配给soap信封。有没有我不知道的配置设置,或者可能拦截传出的消息并追加instanceId?
以下SOAP示例由.NET客户端生成。信封WSIT发送和这个之间唯一的区别是WSIT之一缺少背景节点:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:r="http://schemas.xmlsoap.org/ws/2005/02/rm" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
...
<Context xmlns="http://schemas.microsoft.com/ws/2006/05/context">
<Property name="instanceId">{I want to set this Id}</Property>
</Context>
...
</s:Header>
<s:Body>
<IncreaseCounter xmlns="http://tempuri.org/"/>
</s:Body>
</s:Envelope>
我希望它是有道理的。问题不在于ws2007HttpBinding或wsHttpBinding相关或与WCF实例管理相关;每个/通话,会话,单个。我只需要WSIT,Java位的帮助。
答
谁正在对项目的Java结束我的一位同事帮助找出语法。我分享解决方案,因为它可能对其他人有用。这篇文章的意义在于,WSIT文档没有忽略提到可以将Java持久化的WCF服务用于Java客户端。如果您需要编写可以参与长时间运行的工作流程的Java客户端或托管的Windows Workflow(WF)的客户端,则持久WCF非常重要。
下面的Java代码返回相关的头:
private static Header getContextHeader(IDemoService port) {
Header contextHeader = null;
Iterator<Header> iterator = ((WSBindingProvider)port).getInboundHeaders().iterator();
while(iterator. hasNext()){
Header header = iterator.next();
if (header.getLocalPart().equalsIgnoreCase("Context")) {
contextHeader = header;
}
}
return contextHeader;
}
然后,你可以这样设置背景:
Header contextHeader = getContextHeader(port);
((WSBindingProvider)port).setOutboundHeaders(contextHeader);
答
您可能必须指定WCF服务的实例管理,有3个选项:
- 每通话
- 每学期
- 单
看起来像你所需要的每个会话。
感谢您的反馈意见;我已经在使用每个会话,并且在1分钟不活动后我的实例被关闭。问题是每个代理实例都会创建一个WCF会话,并且如果该代理已关闭,则无法重新连接到每个会话实例。持久服务从可配置的persistenceProvider中保存并加载它们的状态。我会在我的问题中添加一些链接,以明确我感兴趣的场景。 – 2011-03-24 17:01:02