Mon application actuelle utilise des web-services d'une API avec succès. Les accès se font de manière séquentielle.

Afin d'améliorer mon application, en performance, je veux utiliser des threads pour certaines actions.

Mais malheureusement, ca coince. Je ne vois pas trop pourquoi et comme je ne suis pas très à l'aise avec les webservices, je me permets de solliter une aide sur le forum.

Pour un appel a la fonction KeepAlive de l'API (fonction pour maintenir la connexion active), dans mon application principale, si je fais:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure KeepAlive;
var
req:KeepAliveReq;
resp:KeepAliveResp;
httprio:thttprio;
begin
  httprio:=Thttprio.Create(nil);
  httprio.WSDLLocation:='GlobalService.xml';
  httprio.Port:='GlobalService';
  httprio.Service:='GlobalService';
  httprio.HTTPWebNode.UseUTF8InHeader := True;
  httprio.HTTPWebNode.InvokeOptions := [soAutoCheckAccessPointViaUDDI];
 
  req:=KeepAliveReq.Create;
  req.header:=GlobalService1.APIRequestHeader.Create;
  req.header.sessionToken:=sessionToken;
  try
  resp:= (httprio as GlobalService).keepAlive(req);
  except;
    ...
  end;
...
end;
Cela fonctionnera, et l'API me répondra comme il se doit.

Par contre, si je fais le même appel dans mon thread, j'ai une violation au niveau de la réponse.


Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
procedure TMyThread.Execute;
var
req:KeepAliveReq;
resp:KeepAliveResp;
httprio:thttprio;
begin
  httprio:=Thttprio.Create(nil);
  httprio.WSDLLocation:='GlobalService.xml';
  httprio.Port:='GlobalService';
  httprio.Service:='GlobalService';
  httprio.HTTPWebNode.UseUTF8InHeader := True;
  httprio.HTTPWebNode.InvokeOptions := [soAutoCheckAccessPointViaUDDI];
 
  req:=KeepAliveReq.Create;
  req.header:=GlobalService1.APIRequestHeader.Create;
  req.header.sessionToken:=sessionToken;
  try
  resp:= (httprio as GlobalService).keepAlive(req); // <--- violation
  except;
    ...
  end;
...
end;

Pourquoi cela fonctionne il dans l'application principale et pas dans le thread?