Mam serwer datasnap z klientem formularzy vcl. Od klienta, w jaki sposób mogę obsłużyć, jeśli serwer został powiedziany zamknięcie i ponownie uruchomiony z istniejących połączeń klienta? Ten scenariusz wywołuje wyjątek 10053 EIdSocketError.Datasnap i SocketError
Aby zreplikować, uruchamiam zarówno serwer, jak i klienta, wykonuję połączenie z serwerem (korzystam z metod ujawnianych przez generator proxy DataSnap), który działa pomyślnie. Następnie wyłączam serwer (np. Zamknij aplikację) i uruchom go ponownie. Próbuję ponownie nawiązać połączenie z serwerem.
np KLIENT wezwanie
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;
dspPolicyGroup jest TDataSetProvider i cdsPolicyGroup jest TClientDataSet (ja po prostu używać go lokalnie do "sklepu" mój wynik TDataSet).
SERWER
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;
Myślę ten jest regularnie napotykanych przez ludzi widząc, że jest to dość łatwe do powtórzenia. Czy przed każdym wywołaniem powinienem wykonać połączenie "Połączenie testowe" lub coś takiego (takie jak metoda TestConnection), aby sprawdzić EIdSocketError (i odpowiednik) i obsłużyć? A może jest to raczej wada projektowa?
Dzięki