2011-03-24 92 views
2

我正在研究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位的帮助。

回答

3

谁正在对项目的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); 
1

您可能必须指定WCF服务的实例管理,有3个选项:

  • 每通话
  • 每学期

看起来像你所需要的每个会话。

http://www.dotnetfunda.com/articles/article912-3-ways-to-do-wcf-instance-management-per-call-per-session-and-single-.aspx

+1

感谢您的反馈意见;我已经在使用每个会话,并且在1分钟不活动后我的实例被关闭。问题是每个代理实例都会创建一个WCF会话,并且如果该代理已关闭,则无法重新连接到每个会话实例。持久服务从可配置的persistenceProvider中保存并加载它们的状态。我会在我的问题中添加一些链接,以明确我感兴趣的场景。 – 2011-03-24 17:01:02

相关问题