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. P>
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. P>
Un autre moyen est de rechercher quelque chose comme "Fichiers ASP.NET temporaires" dans le chemin du dossier Shadow. P>
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? P>
merci. p>
On peut définir un paramètre de configuration de l'application dédié - Iswebserver, mais je n'aime pas cela encore plus. P>
Tout en recherchant une solution à un autre problème, je pense que j'ai résolu celui-ci - les détails sont ici p>
7 Réponses :
Vous pouvez vérifier si ce n'est pas null, il est exécuté à partir d'une application Web. p> Voir httpContext.Current Propriété P> P>
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.
obtient une valeur qui spécifie si la présentation actuelle de Windows L'application Foundation (WPF) est Navigateur hébergé. p> blockQuote>
thats comment c'est fait dans xbap em> p>
- effectuer la détection de navigateur en utilisant ASP.NET LI> ul>
ou si vous avez une Appdomain à réfléchir et en obtenir quelque chose? en utilisant em> p>
- Réflexion CallContext LI> ul>
Vous pouvez découvrir le nom du processus actuel: , puis vérifier si c'est le nom de processus ASP.NET p> p>
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.
La meilleure option est un paramètre de configuration. P>
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. P>
C'est l'option que j'aurai. P>
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 code> 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.
Essayer de résoudre un autre problème, j'ai trouvé une bonne solution pour celui-ci.
Il existe une méthode privée (selon le réflecteur) p> 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. P> Je vais coller à cela. P> P> system.configuration.Settingspropertyvalue.ishostedinaspnet code>, 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:
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 code> 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/ ...
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. P>
Bien sûr, cela dépend de la situation ou non de la situation, vous pouvez facilement faire cela. P>
Voir la réponse que j'ai fournie ici ... P>
Fondamentalement, vous pouvez utiliser Hostingenvironment.Sisté . P>
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.