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