gpt4 book ai didi

WCF 客户端应用程序持久连接到非 WCF (DataSnap) 服务器

转载 作者:行者123 更新时间:2023-12-03 17:59:38 25 4
gpt4 key购买 nike

什么有效

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

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

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

.

问题

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

.

可能的解决方法

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

.

我的问题

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

非常感谢任何建议!

.

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

最佳答案

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

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

来自 MSDN 文档:

For example, if the SessionMode property is set to SessionMode.Required and the InstanceContextMode property is set to PerSession, clients can use the same connection to make repeated calls to the same service object.

(由我突出显示)


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

关于WCF 客户端应用程序持久连接到非 WCF (DataSnap) 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11216840/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com