我正在开发一个WCF - WSIT(Metro)集成项目,我想允许Java客户端连接到Durable Services。
耐用服务 http://msdn.microsoft.com/en-us/library/bb410767(v=vs.90).aspx
持久服务需要wsHttpContextBinding,这似乎工作正常。唯一的问题是WSIT客户端生成的代理似乎无法将instanceId分配给soap信封。是否有配置设置我不知道或者可能是拦截传出消息并附加instanceId的方法?
以下SOAP示例由.NET客户端生成。信封WSIT发送与此之间的唯一区别是WSIT中缺少Context节点:
<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实例管理相关的; per / call,session,single。我只需要有关WSIT,Java位的帮助。
答案 0 :(得分:3)
我的一位正在项目Java端工作的同事帮助弄清楚了语法。我分享解决方案,因为它可能对其他人有用。这篇文章的意义在于,WSIT文档都没有忽略提及持久的WCF服务可以与Java客户端一起使用。如果您需要编写可以参与长时间运行的工作流的Java客户端或托管的Windows工作流(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);
答案 1 :(得分:1)
您可能必须指定wcf服务的实例管理,有3个选项:
看起来你需要每个会话。