OVH Cloud OVH Cloud

[PB] IIS - COM - WS

2 réponses
Avatar
Delf
Bonjour.

Je suis en train d'écrire des WebServices qui doivent accéder à une
interface COM d'une application AX. Cette application est lancée
manuellement par un utilisateur sur le système (Windows 2000 ou XP). Il
ne s'agit pas d'un service.
Une fois lancée (AX), les WebServices doivent être en mesure d'utiliser
l'interface COM de l'instance AX en cours.

Mon problème : une fois AX lancée, les WS n'arrivent pas à 'accéder' à
l'instance... au lieu de celà, une nouvelle instance est créée
(seulement, ce cas là est à exclure. Les WS doivent *impérativement*
utiliser l'instance en cours).

Celà fonctionne avec Apache + mod_aspnet en mode console uniquement. Ce
que je souhaite, c'est que ca fonctionne sous IIS.

J'ai essayé en modifiant la balise processMachin dans le machine.conf
sans succès.

Ma question : comment faire en sorte que le service IIS puisse utiliser
l'interface COM de AX qui tourne en mode utilisateur ?

Merci anticipé.

--
Delf

2 réponses

Avatar
Delf
Delf wrote:

Celà fonctionne avec Apache + mod_aspnet en mode console uniquement. Ce
que je souhaite, c'est que ca fonctionne sous IIS.



C'était le cas sous 2000, sous XP, erreur : "Échec de QueryInterface
pour l'interface AMEProxy.IAMEClient"

--
Delf
Avatar
Olivier Huet
Bonjour,

Delf a écrit :
Mon problème : une fois AX lancée, les WS n'arrivent pas à 'accéder' à
l'instance... au lieu de celà, une nouvelle instance est créée
(seulement, ce cas là est à exclure. Les WS doivent *impérativement*
utiliser l'instance en cours).



Oui ce n'est pas dans la même session, ça doit être pour ça.

Tout d'abord c'est assez curieux de vouloir faire ça : l'application ne
sera absolument pas robuste.

Une première idée serait de faire tourner ton web service sous la
session interactive (hic) : avec ASP .Net dans IIS6 je ne suis pas trop
sûr que l'on puisse. Avec ASP (non .Net) dans IIS 5, c'était peut-être
possible en triturant le package com+ généré quand on créait une
application web "Isolated" (dans l'onglet home directory).

Sinon, il y a peut-être plus simple, mais voici un moyen qui devrait
marcher. Par contre, si tu ne connais pas/peu COM, tu auras peut-être
quelques soucis pour faire marcher ça :

Il faudrait modifier ton ActiveX (au fait il est écris en quel langage
?) pour qu'il s'inscrive dans la "running objects table" avec notemment
le flag ROTFLAGS_ALLOWANYCLIENT
(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/cmi_q2z_33n6.asp)
sous un nom donné, à l'aide d'un moniker : en lui donnant un "nom".

Voici un lien où tu peux trouver une explication sur le mécanisme, ainsi
qu'un moniker tout fait (à compiler avec VC++ 6 : il marche peut-être
aussi avec VC++ 2003 je n'ai pas testé) :

http://www.microsoft.com/msj/1199/wicked/wicked1199.aspx

(il y a par contre un petit bug dans le code : dans InstanceMoniker.h,
ligne 164, il faut enlever le HRESULT pour éviter de masquer celui du
dessus - sinon ça plante quand on essaie d'obtenir un objet sous un nom
qui n'existe pas)

Ensuite, depuis .Net, je pense que tu peux faire un
System.Runtime.InteropServices.Marshal.BindToMoniker avec comme nom
celui que tu as utilisé à l'enregistrement : si tu prends celui de
l'article, il commencera par "Instance:" (cf article).


Voilà , mais il serait plus simple d'éviter de faire ça, l'architecture
que tu décris n'est pas très viable !

Olivier Huet