2010-11-01 5 views
1

J'ai un service web WCF ASP.Net 4.0 que nous appellerons "WebService". WebService consomme un assemblage de bibliothèque de classes que nous appellerons "WebServiceClassLibrary". WebServiceClassLibrary fait référence à un autre assembly de bibliothèque de classes ("ExternalClassLibrary"). ExternalClassLibrary est construit pour utiliser un fichier de configuration. Il utilise ce fichier pour savoir où envoyer des messages HTTP lors de l'exécution. J'ai un problème où peu importe où je semble mettre la section de configuration pour ExternalClassLibrary il semble utiliser la configuration par défaut (un comportement que je suis venu à attendre quand il ne peut pas trouver un fichier de configuration à l'exécution).Où .Net recherche-t-il mon fichier de configuration?

Je suppose que cela signifie que lorsque .Net tente de trouver la configuration pour ExternalClassLibrary, il ne peut pas le faire et utilise les informations de configuration trouvées dans l'assembly compilé. J'ai tenté de remplacer cette configuration en plaçant une section de configuration dans le fichier web.config pour WebService, en créant un fichier de configuration pour ExternalClassLibrary et en créant un fichier de configuration pour WebServiceClassLibrary. Même si j'essaye de remplacer la configuration dans chacun de ces endroits, il finit toujours par utiliser la configuration par défaut. J'héberge le site dans IIS 7.

Quelqu'un peut-il me dire comment je peux déterminer où j'ai besoin de placer cette information de configuration prioritaire? J'ai essayé d'utiliser le moniteur de processus de SysInternals pour voir les tentatives de lecture de système de fichiers qui échouent mais cela montre seulement deux endroits possibles pour remplacer la configuration et aucun d'eux n'a fait l'affaire.

Appréciez-le!

- MISE À JOUR, Voici le contenu du fichier XML que je suis en train de charger -

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
     <sectionGroup name="applicationSettings" type="System.Configuration.ApplicationSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" > 
      <section name="MyAppName.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" /> 
     </sectionGroup> 
    </configSections> 
    <applicationSettings> 
     <MyAppName.Properties.Settings> 
      <setting name="APIURL" serializeAs="String"> 
       <value>http://servername/default.html</value> 
      </setting> 
      <setting name="APIAPPINI" serializeAs="String"> 
       <value>app.ini</value> 
      </setting> 
      <setting name="ApiUrlRoot" serializeAs="String"> 
       <value>https://www.domain.com/company[instance]test/index.htm</value> 
      </setting> 
      <setting name="ApiInstances" serializeAs="Xml"> 
       <value> 
        <ArrayOfString xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
         xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 
         <string>usa</string> 
         <string>eu</string> 
         <string>asia</string> 
         <string>lat</string> 
         <string>jpn</string> 
        </ArrayOfString> 
       </value> 
      </setting> 
      <setting name="ApiKey" serializeAs="String"> 
       <value>password</value> 
      </setting> 
      <setting name="ApiUrlRoot" serializeAs="String"> 
       <value>http://site[instance].domain.com/</value> 
      </setting> 
      <setting name="ProductId" serializeAs="String"> 
       <value>12345</value> 
      </setting> 
     </MyAppName.Properties.Settings> 
    </applicationSettings> 
</configuration> 
+0

Vous ne savez pas si cela va vous aider, mais j'avais une question similaire sur les fichiers de configuration pour les bibliothèques de classes il y a un certain temps .... http://stackoverflow.com/questions/2526202/where-are-config-files-for-class-libraries-physically-located –

+0

La plupart des articles sur cette page parlent du fichier de configuration utilisé par l'application parente ou consommatrice. C'est ce que j'ai trouvé être vrai dans le passé, mais pour une raison quelconque, cela ne se produit pas maintenant. Semble peu fiable. WebService est l'application consommatrice mais l'ajout de la configuration à ce fichier n'entraîne pas l'utilisation de valeurs mises à jour. – omatase

Répondre

1

La bonne réponse (que ma question était formulée) est en fait dans la question elle-même

J'ai essayé de remplacer cette configuration en plaçant une section de configuration dans le fichier web.config ...

Dans .Net lors de la consommation d'un assembly, le framework recherche la configuration dans le fichier de configuration de l'assembly consommateur. Voilà donc la réponse à la question. C'est là que j'ai appris à placer des informations de configuration pour les assemblages dans le passé, mais dans ce cas, cette méthode semblait me manquer. La raison pour laquelle je n'avais aucune chance dans ce cas avec le fichier web.config remplaçant la configuration par défaut est due à un bogue dans mon code où, en essayant réellement de demander la valeur dans le fichier de configuration, je demandais explicitement le " DefaultValue "qui sera toujours ce qui se trouve dans l'assemblage compilé.

Le code est comme ceci:

Properties.Settings.Default.Properties["ApiUrlRoot"].DefaultValue; 

Je ne savais pas alors que je développais que ce serait le cas.Je devais essais et erreurs pour obtenir la valeur lors de l'indexation dans les propriétés au lieu de la méthode standard fortement typée pour les valeurs de lecture:

Properties.Settings.Default.ApiUrlRoot; 

En effet, cette partie de mon code a dû lire la valeur de la configuration fichier dynamiquement. Selon la situation, il lirait une valeur différente du fichier de configuration. En fin de compte voici la version du code de lecture de configuration dynamique qui fonctionne:

Properties.Settings.Default.PropertyValues["ApiUrlRoot"].PropertyValue; 
2

Votre ExternalClassLibrary devrait charger la config comme

ConfigurationManager.OpenExeConfiguration("ExternalClassLibrary.dll.config"); 

.Net ConfigManager par des charges par défaut seulement le processus principal config (exe.config/web.config), n'importe quelle DLL utilisant dll.config devrait charger explicitement.

+0

C'est ce que je cherchais. Appréciez-le! – omatase

+0

Ok, je dois avoir parlé trop tôt. Il charge le fichier de configuration, HasFile est vrai et il affiche même le chemin comme le fichier de configuration comme étant le bon fichier, mais si je regarde de plus près, je vois qu'il n'y a pas d'applicationSettings chargée. Ceci, même s'il y a applicationSettings dans le fichier de configuration chargé. Je pense que le problème est que cela ne chargera l'applicationSettings si elle connaît la configuration que je veux charger, mais je ne peux pas comprendre comment le dire et une recherche rapide google sur le sujet ne fait pas de lumière. Une idée? – omatase

+0

Pouvez-vous poster la section de xml – anivas

Questions connexes