2014-11-03 47 views
1

對不起,我的英語, 我已經遷移客戶端和服務器,一切運行良好, ,直到我注意到服務器的遠程數據模塊不能正常工作。當我從需要更多的時間在客戶端運行的查詢,其他遠程數據模塊依然被擱置(包括與主thred)。它的行爲像線程模型是tmSingle。我環顧四周,試着找到沒有成功的一切。更爲奇怪的是,我註冊了新的服務器(與XE6建造),舊(與D7建造)開始給相同的症狀。從Delphi 7到XE6的DataSnap遷移

在安裝機器上的新服務器正在運行alredy舊我用

xxxxx.exe/unregserver(舊的)和

xxxxx.exe/REGSERVER(新一個),然後是顯而易見的問題。即使我取消註冊新服務器,並註冊舊服務器,問題仍然存在。

的客戶機和服務器通過的DataSnap插座(帶TSocketConnection和TConnectionBroker客戶端)進行通信。

這裏是服務器

一些信息Server_TLB

unit Server_TLB; 
uses Windows, ActiveX, Classes, Graphics, Midas, StdVCL, Variants; 
const 

    LIBID_Server: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}'; 

    IID_IrdmServer: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}'; 
    CLASS_rdmServer: TGUID = '{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}'; 

    IrdmServer = interface; 
    IrdmServerDisp = dispinterface; 

    rdmServer = IrdmServer; 

    IrdmServer = interface(IAppServer) 
    ['{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}'] 
    ........... methods.......... 


    IrdmServerDisp = dispinterface 
    ['{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}'] 
    ........... methods.......... 

    CordmServer = class 
    class function Create: IrdmServer; 
    class function CreateRemote(const MachineName: string): IrdmServer; 

implementation 

uses ComObj; 

class function CordmServer.Create: IrdmServer; 
begin 
    Result := CreateComObject(CLASS_rdmServer) as IrdmServer; 
end; 

class function CordmServer.CreateRemote(const MachineName: string): IrdmServer; 
begin 
    Result := CreateRemoteComObject(MachineName, CLASS_rdmServer) as IrdmServer; 
end; 

end. 

創作

Forms.Application.ShowMainForm := False; 
    Forms.Application.Initialize; 
    Forms.Application.CreateForm(TdmServer, dmServer); 
    Forms.Application.CreateForm(TfMain, fMain); 
    windows.PostMessage(fMain.Handle, MSG_INITIALIZE, 0, 0); 
    Forms.Application.Run; 

與RDM

initialization 
    TComponentFactory.Create(ComServer, TrdmServer, 
    Class_rdmServer, ciMultiInstance, tmFree); 

..the序列..initialisation STANDAR d SocketDispatcher和非標準SConnect

而且alredy與設置鍵tryed

[HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx}\InprocServer32] 
"ThreadingModel"="Free" or "Both" 

我錯過了什麼東西?

謝謝你的幫助!

回答

1

在這種情況下,我會創建一個具有正確的線程模型的簡單DataSnap客戶機/服務器應用程序,測試,然後比較你的移植項目的代碼自動生成的服務器模塊的代碼。

這樣一來,就可以檢測危急的差異,調整代碼是測試項目服務器模塊中的等價物。

+0

我已經與創建DataSnap服務器/客戶端的新的簡單測試,似乎很好地工作。但是D7和XE6服務器的體系結構是不同的。我無法比擬的東西。明天再見。謝謝。 – user2949632 2014-11-03 21:01:19

1

我建議你檢查:a MIDAS/DataSnap服務器上

安全:http://qc.embarcadero.com/wc/qcmain.aspx?d=8814

此外,套接字服務器已被棄用,也有一些缺點:

  • 它繞過DCOM安全。一切都在其中運行服務器的用戶的安全上下文中運行(如果是本地系統,它具有最強大的特權 - 提防的)
  • 連接,除非你爲它編寫一個模塊,缺乏基本的securee未加密密鑰交換功能。DCOM可以對數據包進行加密和認證(儘管它的加密技術現在不是很強大) - 您只需要在dcomcnfg中配置即可。
  • 它不支持64個值等多種類型,看到http://qc.embarcadero.com/wc/qcmain.aspx?d=69924
+0

我已經在項目的UpdateRegistry中應用了修復程序。問題不在那裏。 10x – user2949632 2014-11-03 20:48:05

+0

您是否檢查同一臺機器上的客戶端和服務器是否直接使用DCOM工作? – LDS 2014-11-03 21:45:32

+0

此外,事件查看器不報告什麼?我還建議使用調試工具(遠程調試,sysinternals debugview/ProcessMonitor等)來跟蹤服務器實際執行的操作以及掛起的位置。 還請檢查dcomcnfg設置。至少D5-D6以來,Delphi DCOM Datasnap並沒有真正改變,但Windows確實如此。你在運行什麼操作系統? – LDS 2014-11-04 08:34:06