【问题标题】:Can I use WCF wsHttpContextBinding with WSIT (Metro) clients?我可以将 WCF wsHttpContextBinding 与 WSIT (Metro) 客户端一起使用吗?
【发布时间】:2011-04-08 23:48:22
【问题描述】:

我正在开发一个 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 实例管理相关之类的;每次/通话、会话、单次。我只需要 WSIT 和 Java 方面的帮助。

【问题讨论】:

  • 您能否分享您的代码以从 Java 客户端使用 wsHttpBinding 调用 WCF 服务?我也在寻找这个解决方案,但仍然无法做到。

标签: wcf glassfish wshttpbinding wsit durable-services


【解决方案1】:

我的一位在项目的 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); 

【讨论】:

    【解决方案2】:

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

    • 每次通话
    • 每次会话
    • 单人

    看起来您需要每个会话。

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

    【讨论】:

    • 感谢您的反馈;我已经在使用 Per Session 并且我的实例在 1 分钟不活动后被终止。问题是每个代理实例都创建了一个 WCF 会话,如果代理关闭,则无法重新连接到每个会话实例。持久服务从可配置的 persistenceProvider 保存和加载它们的状态。我将在我的问题中添加一堆链接,以明确我感兴趣的场景。
    猜你喜欢
    • 1970-01-01
    • 2010-10-28
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2020-10-10
    • 1970-01-01
    • 2018-08-21
    • 1970-01-01
    相关资源
    最近更新 更多