我可以将WCF wsHttpContextBinding与WSIT(Metro)客户端一起使用吗?

时间:2011-03-24 13:40:08

标签: wcf glassfish wshttpbinding wsit durable-services

我正在开发一个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位的帮助。

2 个答案:

答案 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个选项:

  • 每次通话
  • 每个会话

看起来你需要每个会话。

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