什么有效
我在 Delphi-XE2 中构建了一个 DataSnap Web 服务TDSServer
,它使用和TDSHTTPService
组件。客户端连接到服务器(Web 服务)并运行 DataSnap 服务器方法来检索数据。服务器TDSLifeCycle.Session
用于所有连接。如果可能,我想继续使用Session
,因为我将会话信息存储在线程变量中......
我可以使用 Internet Explorer 对 DataSnap 服务器进行身份验证和检索数据。如果我不让 IE 闲置 30 秒(或者它与服务器断开连接),它将为每个方法请求重用相同的连接。
我可以使用一个简单的 Delphi 应用程序,它使用 TIdHTTP 连接到 DataSnap 服务器。添加keep-alive
到它的Request.Connection
属性使它永远保持连接,并为所有方法调用重用一个连接。
.
问题
第 3 方公司正在构建一个 WCF 应用程序来访问 DataSnap 服务。他们无法让 WCF 应用程序仅使用一个与服务的连接。初始身份验证请求和第一个方法调用使用相同的连接,但后续请求会创建新连接,这可以通过netstat
在他们的计算机上运行并使用多个源端口看到从他们的应用程序到我的服务的新 ESTABLISHED 连接来证明。新连接会在 DataSnap 服务器中创建新线程,这些线程无法访问经过身份验证的线程的会话变量。
.
可能的解决方法
我知道我可以将 DataSnap 服务器更改为Invocation
模型,从而无需为每个客户端维护一个持久连接,并且如果需要,我会这样做。在这样做之前,我认为谨慎的做法是看看是否有其他人知道如何解决问题。
.
我的问题
WCF 客户端应用程序是否有可能创建到非 WCF 服务器(DataSnap 服务器)的单个持久连接,它用于所有方法调用而不创建新连接?这是怎么做到的?是否像在 Visual Studio 中为 C# WCF 项目添加正确的【装饰】一样简单?
任何建议都非常感谢!
.
仅供参考 - 我无权访问第 3 方的代码,因此我无法提供 WCF 代码示例。