2021/03/02

DataSnap Clinet 建立過濾器後連線出現 "Connection Closed Gracefully" 錯誤

本文為【ebook【Delphi跨平台資料庫程式設計火速上手】電子書出版 (CHT)】的補充教材。

DataSnap 伺服器端可以設定的過濾器(Filter)有:

  • PC1 加密過濾器
  • RSA 加密過濾器
  • ZLIB 壓縮過濾器

伺服器端設定後,客戶端也需要進行相同設定,否則便無法使用。僅設定單一過濾器時,此時客戶端可以正確連線。


問題 1 : Illegal argument


Client IDE 設定連線以及 Zlib 過濾器 (Filter) 後,於執行時期 (RunTime) 當下會出現 Illegal argument 例外訊息,看完這個訊息仍舊不知道如何修正。

問題 2 : Connection Closed Gracefully

在設定複數過濾器,如 PC1 + ZLIB 後,設定時期使用客戶端的 IDE 連線到 DS Server 時,會出現【Connection Closed Gracefully】錯誤。

但在 Run-Time 執行時期則可以正常連線。

原因

  1. 客戶端設定 ZLIB 過濾器後,並未主動替我們加入對應單元,進而導致執行時期發生錯誤。
  2. Bob Swart 當時指出需要 SSL 加解密函式庫,但事實並非如此,就算將 libeay32.dll 和 ssleay32.dll 複製到可能被執行的資料夾仍無法排除此錯誤;熱心網友在追查後發現此為 Delphi IDE BUG:只要設定複數過濾器即會發生此錯誤。

解決方式

  • 客戶端必須手動 uses DBXCompressionFilter 單元。
  • 在 XE1 時就有推出 Update Fix 修正此問題。
  • 使用 RSA 加密時,伺服器端和客戶端各自都必須使用 libeay32.dll 和 ssleay32.dll 兩個檔案;但 PC1 則不需要。
  • 過濾器設定上,客戶端順序要和伺服器端相反,例如伺服器端若是 Zlib ➜ RSA or PC1 (Eden: 先壓縮再加密),則客戶端就必須反向設定 RSA or PC1 ➜ Zlib (Eden: 先解密再解壓縮)

 

和你分享 ❤️

See also

沒有留言:

張貼留言