OVH Cloud OVH Cloud

ActiveX et appel asynchrone

2 réponses
Avatar
Stephane
Bonjour,

Je souhaite appeler une méthode sur un ActiveX de manière asynchrone de
manière à mettre en place un timeout que cette méthode ne gère pas. Le
tout depuis un webservice autorisant l'impersonate.

L'appel à cette méthode fonctionne en dehors de l'appel asynchrone. Si
je place le même appel dans la méthode exécutée de manière asynchrone,
une exception est générée du type "Accés refusé".

L'activeX sert essentiellement à se connecter sur une bdd distante.
Cela peut-il avoir un lien ?

Avez-vous une idée sur ce qui pourrait bloquer l'appel à cette méthode ?

Merci
Stéphane

2 réponses

Avatar
adebaene
Stephane a écrit :

Bonjour,

Je souhaite appeler une méthode sur un ActiveX de manière asynchrone de
manière à mettre en place un timeout que cette méthode ne gère pa s. Le
tout depuis un webservice autorisant l'impersonate.

L'appel à cette méthode fonctionne en dehors de l'appel asynchrone. Si
je place le même appel dans la méthode exécutée de manière asyn chrone,
une exception est générée du type "Accés refusé".

L'activeX sert essentiellement à se connecter sur une bdd distante.
Cela peut-il avoir un lien ?

Avez-vous une idée sur ce qui pourrait bloquer l'appel à cette mét hode ?



Quand tu fais un appel asynchrone, l'appel est réellement réalisé
sur un thread ouvrier du pool de thread .NET.
Par ailleurs, l'impersonation se fait par thread. Donc, ton threadqui
fait le BeginInvoke impersonne bien ton client, mais ce n'est pas le
cas du thread ouvrier qui fait réellement le boulot, d'où l'acces
refusé.

La seule solution est d'impersonner manuellement le client dans ton
thread ouvrier avant de faire un appel (synchrone!) à l'ActiveX.
Il faut donc que, dans ton thread "principal" tu appelles
WindowsIdentity.GetCurrent() et que tu passes l'identity retournée à
ton thread ouvrier, et que dans ton thread ouvrier tu fasses un
Impersonate sur cet objet avant d'appeler de manière syncrhone ton
ActiveX.

Arnaud
MVP - VC
Avatar
Stephane
Bonjour,

Merci pour ces explications à la fois très claires et très précises sur
l'origine du problème et la manière de le résoudre.

Stéphane

a écrit :
Stephane a écrit :


Bonjour,

Je souhaite appeler une méthode sur un ActiveX de manière asynchrone de
manière à mettre en place un timeout que cette méthode ne gère pas. Le
tout depuis un webservice autorisant l'impersonate.

L'appel à cette méthode fonctionne en dehors de l'appel asynchrone. Si
je place le même appel dans la méthode exécutée de manière asynchrone,
une exception est générée du type "Accés refusé".

L'activeX sert essentiellement à se connecter sur une bdd distante.
Cela peut-il avoir un lien ?

Avez-vous une idée sur ce qui pourrait bloquer l'appel à cette méthode ?




Quand tu fais un appel asynchrone, l'appel est réellement réalisé
sur un thread ouvrier du pool de thread .NET.
Par ailleurs, l'impersonation se fait par thread. Donc, ton threadqui
fait le BeginInvoke impersonne bien ton client, mais ce n'est pas le
cas du thread ouvrier qui fait réellement le boulot, d'où l'acces
refusé.

La seule solution est d'impersonner manuellement le client dans ton
thread ouvrier avant de faire un appel (synchrone!) à l'ActiveX.
Il faut donc que, dans ton thread "principal" tu appelles
WindowsIdentity.GetCurrent() et que tu passes l'identity retournée à
ton thread ouvrier, et que dans ton thread ouvrier tu fasses un
Impersonate sur cet objet avant d'appeler de manière syncrhone ton
ActiveX.

Arnaud
MVP - VC