【问题标题】:WCF ReliableMessaging - Connect to existing OperationContext using SessionIdWCF ReliableMessaging - 使用 SessionId 连接到现有 OperationContext
【发布时间】:2011-03-22 13:13:48
【问题描述】:

我目前正在处理 WCF - WSIT 集成任务。我将 WS-ReliableMessaging 与 WCF 和 ws2007HttpBinding 一起使用。

可靠会话设置正确,我正在使用 InstanceContextMode.PerSession 并且我的服务实例在一分钟不活动后被终止。

我唯一担心的是我不确定如何创建使用现有 OperationContext 的 SessionId 初始化的 WCF 代理。 Visual Studio 生成的代理似乎不接受 SessionId 作为构造函数等。

我希望能够使用 SessionId 重新连接到活动服务,即使我的代理客户端死亡并且我不得不重新创建它。

【问题讨论】:

    标签: wcf wshttpbinding ws-reliablemessaging wsit


    【解决方案1】:

    据我所知,WCF 中的可靠会话只有在客户端和服务器都处于活动状态时才会存在。可靠会话在通道级别实现为 WS-ReliableMassaging,它提供传输级别的可靠性 - 这意味着它可以处理丢失的消息,以便交付、重新发送消息等 = 可靠性只是为了克服不可靠的传输协议,如 HTTP。

    对于任何参与者都可能“死亡”或离线的情况,您必须使用消息传递(MS 世界中的 MSMQ)。在与 Java 世界集成时,您可能需要其他基于 JMS 的消息传递平台。

    【讨论】:

    • 感谢您的快速回复。我做了一些测试,你似乎是对的。 sessionId 是在频道打开期间设置的,无论我挖掘多深,我都无法更改它。我在这里尝试解决的问题不是错误处理,而是与会话管理有关。我希望我能够从正在运行的服务断开并重新连接我的客户端。
    • 在我的客户端断开连接但我的客户端无法重新连接后,我的服务实例似乎还活着并且像无头鸡一样运行了一段时间。我想我需要使用 ASP Session 或类似的东西来保持服务状态的状态,这意味着在客户端解析和重新附加一个 cookie。
    • 我担心这是不可能的。未处理的异常将终止服务部分,因此如果您想与服务通信,则必须打开新的客户端代理。
    • 是的,没关系;看来我不能重用相同的会话 ID。我唯一能做的就是将客户端安全详细信息映射到 ASP.NET 会话。例如,如果我的客户使用用户名连接;我的应用程序需要将 userId 映射到 ASP.NET 会话并从中初始化实例。另一种选择是第一次从响应标头中提取 ASP.NET sessionId 并将 cookie 读取到请求中。 blogs.msdn.com/b/wenlong/archive/2010/02/21/…
    【解决方案2】:

    您可以使用持久服务

    http://www.wcftutorial.net/How-to-Create-Durable-Service.aspx http://blogs.microsoft.co.il/blogs/egady/archive/2008/01/05/wcf-3-5-durable-services.aspx

    【讨论】:

    • 我同意。在服务器端保持状态将解决会话管理问题。我将尝试您提到的持久服务示例。我认为我的问题的结论是基于 wsHttp 绑定的可靠消息传递和会话仅与通信会话有关;它不会涵盖开箱即用的工作流状态和断开连接的客户端场景。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-09
    • 1970-01-01
    • 2020-11-30
    • 2021-08-13
    相关资源
    最近更新 更多