【问题标题】:WCF Client App Persistent Connection to non-WCF (DataSnap) ServerWCF 客户端应用程序与非 WCF (DataSnap) 服务器的持久连接
【发布时间】:2012-06-28 07:58:12
【问题描述】:

什么有效

我在 Delphi-XE2 中构建了一个 DataSnap web 服务,它使用了 TDSServerTDSHTTPService 组件。客户端连接到服务器(web 服务)并运行 DataSnap 服务器方法来检索数据。服务器使用TDSLifeCycle.Session 进行所有连接。如果可能,我想继续使用Session,因为我将会话信息存储在线程变量中......

可以使用 Internet Explorer 对 DataSnap 服务器进行身份验证和检索数据。如果我不让 IE 闲置 30 秒(或者它与服务器断开连接),它将为每个方法请求重用相同的连接。

可以使用一个简单的 Delphi 应用程序,该应用程序使用 TIdHTTP 连接到 DataSnap 服务器。将keep-alive 添加到其Request.Connection 属性使其永远保持连接,并为所有方法调用重用one连接。

.

问题

第 3 方公司正在构建一个 WCF 应用程序来访问 DataSnap 服务。他们无法让 WCF 应用仅使用一个与服务的连接。初始身份验证请求和第一个方法调用使用相同的连接,但后续请求会创建新连接,这可以通过在他们的计算机上运行 netstat 并使用多个源端口看到从他们的应用程序到我的服务的新 ESTABLISHED 连接来证明。新连接在 DataSnap 服务器中创建新线程,无法访问经过身份验证的线程的会话变量。

.

可能的解决方法

我知道我可以将 DataSnap 服务器更改为 Invocation 模型,从而无需为每个客户端维护 一个 持久连接,如果需要,我会这样做。在这样做之前,我认为谨慎的做法是看看是否有其他人知道如何解决问题。

.

我的问题

WCF 客户端应用程序是否可以创建到非 WCF 服务器(DataSnap 服务器)的单个持久连接,它用于所有方法调用而不创建新连接?这是怎么做到的?是不是像在 Visual Studio 中给 C# WCF 项目添加正确的【装饰】一样简单?

非常感谢任何建议!

.

仅供参考 - 我无权访问第 3 方的代码,因此无法提供 WCF 代码示例。

【问题讨论】:

    标签: wcf delphi delphi-xe2 datasnap persistent-connection


    【解决方案1】:

    您的 Delphi 应用程序提供有状态的 Web 服务(使用会话变量)和 WCF web services are stateless by default,包括 WCF 客户端。

    也许this answer 指向正确的配置(ServiceContract 的wsHttpBindingSessionMode)。

    来自 MSDN 文档:

    例如,如果 SessionMode 属性设置为 SessionMode.Required 并且 InstanceContextMode 属性设置为 PerSession,客户端可以使用同一个连接进行重复调用 到同一个服务对象。

    (由我突出显示)


    但是,由于 DataSnap 的主要设计目的不是与 WCF 互操作,因此重新设计 Delphi 端以使用无状态 Web 服务模型而不是有状态可能更容易。这需要对每个服务请求进行身份验证,但在内部,Delphi Web 服务可以缓存一些数据以减少查找时间,类似于当前会话状态。

    【讨论】:

    • 感谢 @mjn,尤其是 MSDN 摘录。经过几天的努力,我倾向于同意你的最终想法——让我的 Web 服务与更多平台兼容,包括 WCF 客户端,无状态模型更有意义。我们将研究这两个选项,并根据我们的项目时间表做最有意义的事情。
    猜你喜欢
    • 2012-06-09
    • 1970-01-01
    • 1970-01-01
    • 2010-09-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多