2009-02-25 7 views
0

Dans un service Web .Net, est-il possible de déterminer si l'assembly a été chargé dans un service Web? Si c'est le cas, comment un tel contrôle serait-il effectué? Et à partir d'un tel contrôle peut-on déterminer l'emplacement d'origine de l'assemblage? Il s'agit d'une longue histoire impliquant des assemblages partagés entre plusieurs points d'entrée de notre application sur un serveur dont certains sont exposés via des services Web et d'autres sont exposés via des sockets TCP plus traditionnels hébergés dans les services Windows normaux. D'autres services Windows peuvent également être exécutés en utilisant les mêmes assemblys partagés. Les besoins de configuration de chacun sont légèrement différents et les appels comme System.Windows.Forms.Application.ExecutablePath donnent des résultats différents en fonction de ce qui "héberge" l'assembly. Je dois pouvoir calculer de manière fiable l'emplacement de l'assemblage pour calculer l'emplacement du fichier de configuration.Est-il possible de déterminer si l'assembly a été chargé dans un service Web?

Web.config/app.config ne sont pas des options dans ce scénario.

Il serait possible de mettre une entrée dans le registre qui pourrait être utilisée pour déterminer où se trouvent la ou les applications et tous les assemblages. Mais ce ne serait pas aussi souhaitable que d'avoir les applications calculer les emplacements eux-mêmes.

EDIT:

Soit que ce foo.dll peut être appelé à la fois MyApp.asmx (le service Web) et MyService.exe (le service Windows). Est-il de toute façon de déterminer si MyApp.asmx était l'application qui a chargé foo.dll du code-behind (MyApp.dll)?

Répondre

1

Cela obtenir toutes les assemblées chargées dans le contexte d'exécution actuel:

Assembly[] loadedAssemblies = AppDomain.CurrentDomain.GetAssemblies(); 
+0

Cela obtiendra la liste complète des assemblys, mais ne répond pas à la question principale: Comment déterminer si l'assembly s'exécute depuis un service Web. –

+0

Lorsque vous dites "à partir d'un service Web", voulez-vous dire que la vérification se produit à partir du code s'exécutant dans votre service Web ou que vous êtes externe au service Web et que vous souhaitez demander à ce service s'il a chargé un assembly? –

+0

À partir du code s'exécutant dans le service Web. Il peut s'agir d'un assembly supplémentaire chargé par le service Web. –

-1

Vous pourriez faire un appel à:

Assembly.GetExecutingAssembly().CodeBase 

Dans votre code, cela vous dire où l'en cours d'exécution vie d'assemblage.

+0

Oui, mais il ne me dira pas comment déterminer si l'assembly s'exécute depuis un service web ... ce que je veux vraiment savoir. –

0

Si vous possédez le code, il serait préférable d'ajouter une méthode d'initialisation ou une propriété quelconque qui pourrait être utilisée par le code appelant dire l'assembly où il est en cours d'exécution. En fait, vous pouvez ajouter une propriété statique qui est l'emplacement du fichier de configuration. Cela vous aidera également dans d'autres scénarios, comme lors des tests, où vous voudrez spécifier explicitement quel fichier de configuration doit être utilisé, plutôt que d'intégrer la logique pour deviner quel fichier de configuration utiliser.

+0

Une propriété statique peut fonctionner. Cependant, il n'y a aucune garantie que l'application serait placée au même endroit chez chaque client. –

0

Dans la recherche un autre aspect du service web, je suis tombé sur ceci:

string path = Context.Request.ServerVariables["APPL_PHYSICAL_PATH"]; 

Cela renverra quelque chose comme "C: \ inetpub \ wwwroot \ MyWebApp \" indiquant si l'application est installée. Le chemin spécifique dépend de l'emplacement d'installation de l'application. Comme mentionné dans la question, cela n'aidera pas directement foo.dll à déterminer s'il a été appelé ou non à partir d'un service web car foo.dll n'aurait normalement pas accès à Context.Request. Avec quelques modifications apportées à foo.dll, cela permettrait au service Web de dire à foo.dll quelle était la racine de l'application.

Questions connexes