8
votes

Comment un code .NET peut-il savoir s'il est exécuté dans une application Web Server?

J'ai un code de bibliothèque, qui devrait savoir si elle est exécutée dans le contexte d'un serveur Web ou d'un serveur d'applications autonome.

L'évidence qui vient à l'esprit est de vérifier le nom du fichier de configuration de l'application et s'il s'agit de web.config - il s'agit d'un serveur Web, sinon, Server d'application autonome.

Un autre moyen est de rechercher quelque chose comme "Fichiers ASP.NET temporaires" dans le chemin du dossier Shadow.

Mais je n'aime pas les deux, car ils semblent trop hacky et fragiles. Y a-t-il une solution robuste de faire ce que je veux?

merci.

P.s.

On peut définir un paramètre de configuration de l'application dédié - Iswebserver, mais je n'aime pas cela encore plus.

EDIT:

Tout en recherchant une solution à un autre problème, je pense que j'ai résolu celui-ci - les détails sont ici


6 commentaires

Pourquoi avez-vous besoin que cela soit conscient de son contexte?


Nous attribuons une signification particulière au premier dossier du chemin de sondage privé. La chose est que, sous le serveur Web, notre logique devrait fonctionner quelque peu différemment, en raison des différences de configurations de parcours de sondage privées entre un serveur Web et une application autonome.


Peut-être devriez-vous vous mettre de sorte que vous rangiez simplement une mise en œuvre de la structure de stratégie dans votre cadre, de sorte que le cadre lui-même n'a besoin d'aucun code spécial, mais le code vit à la place de votre application Web?


Lasse: Nice idée, néanmoins, il aura probablement besoin de décider de l'utiliser sur certaines fois; La base doit être un paramètre de configuration, IMHO.


Le problème est qu'il nécessite un paramètre de configuration explicite. Je souhaite l'éviter.


Mark: Je sais; Comme je l'ai expliqué dans mon poste, je pense que c'est une erreur.


7 Réponses :


7
votes

Vous pouvez vérifier xxx

si ce n'est pas null, il est exécuté à partir d'une application Web.

Voir httpContext.Current Propriété


2 commentaires

Cela ne fonctionnera que si elle fonctionne dans le même thread que la requête - les threads d'arrière-plan ensuite engendrés n'auront pas un httpContext.


@Drjokepu - précisément. Dans mon cas, httpcontext.current est null.



1
votes

0 commentaires

2
votes

Vous pouvez découvrir le nom du processus actuel: xxx

, puis vérifier si c'est le nom de processus ASP.NET


2 commentaires

Et si cela se déroule à Mono?


Je pense que la réponse sera la même. Le code sera exécuté dans le contexte du processus hôte du serveur Web.



6
votes

La meilleure option est un paramètre de configuration.

C'est mieux pour la testabilité; C'est mieux parce que c'est une déclaration évidente de la manière dont le code fonctionnera, et c'est mieux parce qu'il ne s'appuie pas sur les détails de la mise en œuvre; Vous agissez spécifiquement d'une valeur que vous définissez. Il se peut que la décision que vous effectuez est non évidente et que votre variable / config pouvez suggérer le raisonnement.

C'est l'option que j'aurai.


1 commentaires

Cela semble être un peu courte vue pour moi. Par exemple, l'auteur d'un composant pouvant être distribué et vendu pour une utilisation par d'autres développeurs, je souhaite que la licence se comporte différemment pour les processus Web que des formulaires ou des applications de services ou de console. Je ne veux pas que le développeur d'achat soit capable de "mentir" de la manière dont ils utilisent le composant, et je ne veux pas de faire référence à System.web car mon composant fonctionnera sous le. Profil client net. Je souhaite détecter un environnement Web et modifier en interne le comportement de l'Assemblée en conséquence. Je recherche actuellement la meilleure façon de faire cela.



9
votes

Essayer de résoudre un autre problème, j'ai trouvé une bonne solution pour celui-ci. Il existe une méthode privée system.configuration.Settingspropertyvalue.ishostedinaspnet , ce dont j'ai besoin exactement. Être une méthode privée, je ne veux pas l'appeler (bien que je puisse utiliser la réflexion), mais sa mise en œuvre est triviale: xxx

(selon le réflecteur)

look Comme il existe une clé spéciale dans les données de domaine d'applications - ".appdomain", qui est définie lors de l'exécution dans ASP.NET Web Server.

Je vais coller à cela.


2 commentaires

Je pense vraiment que c'est terrible. Il utilise un détail de mise en œuvre pouvant changer. Est-ce que ça marche sur mono? Je ne peux pas imaginer pourquoi vous ne feriez pas l'option de configuration. Chacun à la sienne.


@Noonsilk Ouais j'ai fait du googling et il semble que .appdomain n'est pas documenté publiquement. Quant à Mono, il semble que cela fonctionnerait car le code définit explicitement une valeur github.com/playScript/playScript-Mono/blob/master/mcs/class/ ...



0
votes

Je pense que la meilleure chose à faire est de fragmenter la bibliothèque en 2 dlls, une véritable générique et une (celle qui nécessite ASP.NET) qui ne fait que charger sur le site Web. Vérification si elle fonctionne actuellement dans ASP.NET se sent comme un peu de hack.

Bien sûr, cela dépend de la situation ou non de la situation, vous pouvez facilement faire cela.


0 commentaires

0
votes

Voir la réponse que j'ai fournie ici ...

Fondamentalement, vous pouvez utiliser Hostingenvironment.Sisté .


0 commentaires