2

我正在开发一个 WCF - WSIT (Metro) 集成项目,我希望允许 Java 客户端连接到持久服务。

持久服务 http://msdn.microsoft.com/en-us/library/bb410767(v=vs.90).aspx

持久服务需要 wsHttpContextBinding,这似乎工作正常。唯一的问题是 WSIT 客户端生成的代理似乎无法将 instanceId 分配给肥皂信封。是否有我不知道的配置设置,或者是否有拦截传出消息并附加 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 实例管理相关之类的;每次/通话、会话、单次。我需要 WSIT 方面的帮助,仅 Java 位。

4

2 回答 2

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); 
于 2011-04-08T15:48:22.843 回答
1

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

  • 每次通话
  • 每个会话
  • 单身的

看起来你需要每个会话。

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

于 2011-03-24T16:45:59.107 回答