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