什么有效
我在Delphi-XE2中构建了一个DataSnap Web服务,它使用TDSServer
和TDSHTTPService
组件。 客户端连接到服务器(Web 服务)并运行 DataSnap 服务器方法来检索数据。 服务器对所有连接使用 TDSLifeCycle.Session
。 如果可能的话,我想继续使用Session
因为我将会话信息存储在线程变量中......
我可以使用 Internet Explorer 对 DataSnap 服务器进行身份验证并从中检索数据。 如果我不让 IE 空闲 30 秒(或它与服务器断开连接),它将为每个方法请求重用相同的连接。
我可以使用一个简单的Delphi应用程序,该应用程序使用TIdHTTP连接到DataSnap服务器。 将keep-alive
添加到其 Request.Connection
属性可使其永久保持连接,并为所有方法调用重用一个连接。
.
问题
第三方公司正在构建一个 WCF 应用程序来访问 DataSnap 服务。 他们无法让 WCF 应用仅使用一个与服务的连接。 初始身份验证请求和第一种方法调用使用相同的连接,但后续请求会创建新连接,这可以通过在其计算机上运行 netstat
并使用多个源端口查看从其应用程序到我的服务的新 ESTABLISHED 连接来证明。 新连接会在 DataSnap 服务器中创建新线程,这些线程无法访问经过身份验证的线程的会话变量。
.
可能的解决方法
我知道我可以将 DataSnap 服务器更改为Invocation
模型,这样就不必为每个客户端维护一个持久连接,如果需要,我会这样做。 在这样做之前,我认为谨慎的做法是看看是否有其他人知道如何解决问题。
.
我的问题
WCF 客户端应用是否可以创建与非 WCF 服务器(DataSnap 服务器)的单个持久连接,该连接用于所有方法调用,而无需创建新连接? 这是怎么做到的? 它是否像在Visual Studio中向C# WCF项目添加正确的[修饰]一样简单?
任何建议将不胜感激!
.
仅供参考 - 我无法访问第三方的代码,因此我无法提供 WCF 代码的示例。
Delphi 应用程序提供有状态 Web 服务(使用会话变量),默认情况下,WCF Web 服务(包括 WCF 客户端)是无状态的。
也许这个答案指向正确的配置(wsHttpBinding 和 ServiceContract 的 SessionMode)。
从 MSDN 访问:
例如,如果"会话模式"属性设置为 SessionMode.Required 和 InstanceContextMode 属性设置为 每个会话,客户端可以使用相同的连接进行重复调用 到同一服务对象。
(由我突出显示)
但是,由于 DataSnap 主要不是为与 WCF 的互操作性而设计的,因此重新设计 Delphi 端以使用无状态 Web 服务模型而不是有状态服务模型可能更容易。这将需要对每个服务请求进行身份验证,但在内部,Delphi Web 服务可以缓存一些数据以减少查找时间,类似于当前会话状态。