Миграция DataSnap с Delphi 7 на XE6

Еще раз извините за мой английский, я уже мигрировал клиент и сервер, и все работало хорошо, пока я не заметил, что модуль удаленных данных сервера не работает так, как ожидалось. Когда я запускаю запрос от клиента, который требует больше времени, другие модули удаленных данных остаются в ожидании (включая и основной поток). Он ведет себя так, как будто модель потока — tmSingle. Я огляделся и попробовал все, что нашел, но безуспешно. Еще более странно то, что там, где я зарегистрировал новый сервер (собранный на XE6), старый (собранный на D7) начал давать те же симптомы.

При установке нового сервера на машину, на которой уже работает старый, я использую

xxxxx.exe /unregserver (для старого) и

xxxxx.exe /regserver (для нового), а дальше заметна проблема. Даже если я отменю регистрацию нового сервера и зарегистрирую старый, проблема останется.

Клиент и сервер взаимодействуют через DataSnap Socket (клиент с TSocketConnection и TConnectionBroker).

Вот немного информации о сервере

Сервер_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.

..инициализация RDM

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

..последовательность создания

    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;

со стандартным SocketDispatcher и стандартным SConnect

Также уже пробовал с ключом настройки

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

Я пропустил что-то еще?

Спасибо вам за помощь!


person mara21    schedule 03.11.2014    source источник


Ответы (2)


В этой ситуации я бы создал простое клиент-серверное приложение DataSnap с правильной моделью потоков, протестировал его, а затем сравнил автоматически сгенерированный код серверного модуля с кодом в вашем перенесенном проекте.

Таким образом, вы можете обнаружить критические различия, настроить код так, чтобы он был эквивалентен серверному модулю тестового проекта.

person mjn    schedule 03.11.2014
comment
Я уже протестировал новый простой созданный сервер/клиент DataSnap и, кажется, работает нормально. Но архитектура серверов D7 и XE6 отличается. Я думаю, что нельзя сравнивать. Увидимся завтра снова. Спасибо. - person mara21; 04.11.2014

Я предлагаю вам проверить:

Безопасность на сервере Midas/DataSnap: http://qc.embarcadero.com/wc/qcmain.aspx?d=8814

Кроме того, сервер сокетов устарел и имеет некоторые недостатки:

  • Он обходит безопасность DCOM. Все запускается в контексте безопасности пользователя, который запускает сервер (если это локальная система, у него самые мощные привилегии - остерегайтесь этого)
  • Соединение не зашифровано, если вы не напишете для него модуль, в котором отсутствуют базовые функции безопасного обмена ключами. DCOM может шифровать и аутентифицировать пакеты (хотя его шифрование сегодня не очень сильное) — вам просто нужно настроить его в dcomcnfg.
  • Он не поддерживает 64-битные значения и другие типы, см. http://qc.embarcadero.com/wc/qcmain.aspx?d=69924
person LDS    schedule 03.11.2014
comment
Я уже применил исправления в UpdateRegistry в проекте. Проблема не в этом. 10x - person mara21; 03.11.2014
comment
Вы проверяли, работают ли клиент и сервер на одном компьютере напрямую с использованием DCOM? - person LDS; 04.11.2014
comment
Кроме того, программа просмотра событий ничего не сообщает? Я бы также предложил использовать средство отладки (удаленная отладка, sysinternals debugview/ProcessMonitor и т. д.), чтобы отслеживать, что на самом деле делает сервер и где он зависает. Также проверьте настройки dcomcnfg. Delphi DCOM Datasnap практически не изменился, по крайней мере, с D5-D6, но Windows изменила. На какой ОС вы работаете? - person LDS; 04.11.2014
comment
Нет записей о событиях в средстве просмотра событий, в отладке - вызов метода от первого клиента достигает точки останова, в это время вызов другого метода от второго клиента - переходит во второй метод, когда первый завершается. В DCOMConfig ничего полезного не нахожу. Спасибо - person mara21; 04.11.2014
comment
Обратите внимание, что QualityCentral закрыт, поэтому вы можете больше не могу получить доступ к qc.embarcadero.com ссылкам. Если вам нужен доступ к старым данным контроля качества, посмотрите QCScraper. - person Remy Lebeau; 09.06.2017