【问题标题】:Delphi XE – Datasnap Filter problemsDelphi XE – Datasnap 过滤器问题
【发布时间】:2011-06-29 10:29:01
【问题描述】:

我有一个使用 PC1 和 Zlib 过滤器的 tcp/ip Datasnap -XE 服务器

在客户端,这两个过滤器都在 DataSnap TSqlConnection 中定义

当客户端连接到服务器时,我收到 “正常关闭连接” 错误消息

如果我只单独使用 PC1 过滤器 - 没有问题

如果我只单独使用 Zlib 过滤器 - 没有问题

关于如何让两个过滤器同时工作有什么想法吗?

【问题讨论】:

    标签: delphi delphi-xe datasnap


    【解决方案1】:

    您还需要将 libeay32.dll 和 ssleay32.dll 与您的客户端应用程序一起部署。

    引用我的 Delphi XE DataSnap 开发课件手册:

    “如果您使用 TCP/IP 以及 RSA 和 PC1 过滤器部署 DataSnap 独立服务器,那么您还必须部署两个 Indy 特定的 SSL DLL:libeay32.dll 和 ssleay32.dll – 或者确保它们已经存在于服务器机器。这些 DLL 是 RSA 过滤器(加密 PC1 过滤器使用的密码)所需要的。没有这两个 DLL,任何想要连接到服务器的客户端都会收到“正常关闭连接”消息,因为服务器无法加载两个 DLL 以启动 RSA 过滤器以加密 PC1 密钥等。

    顺便说一句,任何 DataSnap 客户端都需要相同的两个 DLL,无论是使用 RSA 和 PC1 过滤器连接到 TCP/IP 服务器,还是使用 HTTPS 连接到 ISAPI 过滤器。”

    格罗耶斯,鲍勃·斯沃特

    【讨论】:

    • 我已将 libeay32.dll 和 ssleay32.dll 与 clients.exe 放在同一目录中,但仍然收到“正常关闭连接”错误消息。
    • 那服务器呢?服务器是否也能找到这两个DLL?
    • 我刚刚偶然发现了这个讨论,迟到了,但无论如何:“连接正常关闭”是一个“异常”,但不应被视为“错误”。Indy - DataSnap 使用的 TCP 库使用该异常只是为了表示连接已最终关闭 - 有意关闭。这可能会令人困惑,但这是 Indy 的工作方式。
    【解决方案2】:

    这可能是 DataSnap 中的一个错误。我有完全相同的问题,这是 QC 报告。 http://qc.embarcadero.com/wc/qcmain.aspx?d=91180

    质检报告投票待修复,等待 Delphi-XE 更新。

    编辑 1 一个疯狂的想法,不要在客户端上指定过滤器。

    这是 Pawel Glowacki 关于传输过滤器的论文。 http://edn.embarcadero.com/article/41293 他特别提到您应该将 ZLibCompression 添加到客户端 DataSnap 驱动程序的 Filters 属性中。

    我已经测试不这样做,它工作得很好。您必须将 DBXCompressionFilter 添加到 uses 子句,否则您会收到“ZLibCompression 未注册”错误。

    使用服务器上的 PC1 和 ZLibCompression 并且客户端上没有过滤器,一切都可以按预期工作。我检查了流量,它是加密和压缩的。

    在 Embarcadero 的某个人确认这是应该的方式之前,我会在使用它之前三思而后行。

    编辑 2 这是 Bob Swart 在 Embarcadero 论坛上的一篇帖子,他说在服务器上添加过滤器足够。不是 Embarcadero 直接但非常接近:) https://forums.embarcadero.com/thread.jspa?threadID=48875&tstart=0

    【讨论】:

    【解决方案3】:

    在 Embarcadero 的某个人确认这是应该的方式之前,我会在使用它之前三思而后行。

    这是真的。如果您没有在客户端上指定过滤器,则在连接期间的初始握手协议中会告知服务器的过滤器是什么,并自动添加它们。这是使用过滤器的一种完全合理且安全的方式。

    但请注意,反之亦然。服务器不采用来自连接客户端的过滤器。如果客户端上有 RSA 过滤器,但服务器上没有匹配的过滤器,那么连接时会出现异常,说服务器没有匹配的 RSA 过滤器。客户端上而不是服务器上的任何其他过滤器都将被忽略。

    【讨论】:

    • 我应该提一下,在 XE 中,如果您不向客户端添加 PC1 过滤器,则会添加一个(如果服务器上有匹配的过滤器),但它将具有默认密码.要指定另一个密码,您需要自己添加过滤器。
    【解决方案4】:

    尝试颠倒过滤器的顺序,让客户端始终与服务器相反。 例如

    Server
         Filters = <
           item
             FilterId = 'ZLibCompression'
             Properties.Strings = (
               'CompressMoreThan = 1024')
           end
           item
             FilterId = 'PC1'
             Properties.Strings = (
               'Key = test')
           end>
    
    Client
             Params.Add ('Filters = {"PC1": {"Key": "test"}, "ZLibCompression": {"CompressMoreThan": "1024"}}');
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 2014-03-27
      • 2014-11-24
      • 2016-12-11
      相关资源
      最近更新 更多