Datasnap和SocketError

Jas*_*son 7 delphi datasnap delphi-xe2

我有一个带有vcl表单客户端的datasnap服务器.从客户端,如果服务器已经说出关闭并使用现有客户端连接重新启动,我该如何处理?此方案引发10053 EIdSocketError异常.

为了复制,我运行服务器和客户端,调用服务器(我使用通过DataSnap代理生成器公开的方法)成功.然后我关闭服务器(例如关闭应用程序)并重新启动它.然后我再次尝试拨打服务器.

例如: 客户呼叫

    sm := TsvrPolicySearchClient.Create(datClientDB.SQLConnection1.DBXConnection);
    try
      ds := sm.SearchPolicyByPolicy(40, WCRef, '', 3);
      dspPolicyGroup.DataSet := ds;

      if cdsPolicyGroup.Active then
        cdsPolicyGroup.Refresh
      else
        cdsPolicyGroup.Open;

    finally
      sm.Free;
    end;
Run Code Online (Sandbox Code Playgroud)

dspPolicyGroup是一个TDataSetProvider,cdsPolicyGroup是一个TClientDataSet(我只是在本地使用它来"存储"我的TDataSet结果).

服务器

function TsvrPolicySearch.SearchPolicyByPolicy(AClientId: Integer; WCRefNum, ClientRef: string; SearchMethod: Integer): TDataSet;
begin
  spPolicyByWCRef.Close;
  spPolicyByWCRef.ParamByName('p_client').AsInteger := AClientId;
  spPolicyByWCRef.ParamByName('p_search_method').AsInteger := SearchMethod;
  spPolicyByWCRef.ParamByName('p_wc_refno').AsString := WCRefNum;
  spPolicyByWCRef.Open;
  Result := spPolicyByWCRef;
end;
Run Code Online (Sandbox Code Playgroud)

我认为人们经常会遇到这种情况很容易复制.我应该在每次调用之前首先进行"测试连接"调用(例如方法TestConnection)以检查EIdSocketError(和等效的)并处理?或者它更像是一个设计缺陷?

谢谢

Tro*_*ris 1

解决此问题的最简单方法是将 TDSServerClass LifeCycle 属性更改为“调用”。这将导致您拥有一个无状态服务器,并且服务器将为每个请求创建一个新会话。但是,您将能够关闭并重新连接服务器,而无需中断客户端连接。