2014-11-03 118 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