2009-10-17 10 views
0

Je semble avoir un problème étrange: dans mon fichier global.asax de mon application Application_Start(), j'ai un élément qui part dans ma base de données et qui obtient tous les paramètres de mon application à partir d'un nom/table de valeur, puis les supprime dans l'application via Application.Add(name,value). J'ai une «façade d'application» dans un autre projet qui est utilisé par mes couches de service, couches de données et ainsi de suite afin d'obtenir les paramètres dont j'ai besoin pour faire divers morceaux.Problèmes de récupération des paramètres d'applications ajoutés lors du démarrage de l'application

Dans ma base de données, j'ai deux ou trois entrées:

ConfigName   | ConfigValue 
WebServiceUsername | myUsername 
WebServicePassword | myPassword 

Donc, dans ma méthode, je pars et obtenir ces valeurs de la base de données, et de les mettre dans mon application:

protected void GetApplicationSettings() 
{ 
    //Get all the config values out of the database, and then put them into the application keys... 
    var appConfigAttributes = ApplicationConfigurationService.GetAppConfigNames(); 

    foreach (var appConfig in appConfigAttributes) 
    { 
    Application.Add(appConfig.ConfigName,appConfig.ConfigValue); 
    } 
} 

Voilà comment j'appelle la valeur de l'application à une date ultérieure:

public static string WebServiceUsername 
{ 
    get { return WebConfigurationManager.AppSettings["WebServiceUsername"]; } 
} 

C'est là que ça devient bizarre .

Si j'appelle la façade de l'application de ma couche web avec ceci: (! Oui, je l'ai essayé à peu ConfigurationManager dans la méthode get)

<%= ApplicationFacade.WebServiceUsername %> 

je reçois rien en retour.

Mais c'est la chose bizarre ...

Si je mets manuellement une clé d'application dans mon fichier web.config ...

<appSettings> 
    <add key="putz" value="mash"/> 
</appSettings> 

Et puis construire une propriété similaire dans ma classe ApplicationFacade comme Putz, quand je fais l'appel dans la vue (<%= ApplicationFacade.Putz %>) je reçois 'mash' retourné. Donc, je sais que mon ApplicationFacade fonctionne correctement. Alors peut-être que c'est mon code dans le fichier application_start()?

Eh bien, si je mets cela à mon avis <%=Application["WebServiceUsername"]%>, myUsername est retourné.

Que donne ?!

Réponse

ConfigurationManager.AppSettings.Set(appConfig.ConfigName,appConfig.ConfigValue); 

Répondre

3

En Application_Start lorsque vous faites référence à l'objet Application c'est en fait une instance de HttpApplicationState qui est utilisée pour maintenir l'application des paramètres spécifiques dans la mémoire et n'a rien à voir avec appsettings clé/valeur stocké dans web.config.

  • Lorsque vous utilisez WebConfigurationManager.AppSettings["someKey"] cette option va retourner valeur correspondant à someKey dans la section appSettings de web.config.
  • Lorsque vous utilisez Application["someKey"], cela retourne une valeur mise en cache dans l'instance d'application.

Les deux sont complètement indépendants et vous ne pouvez pas vous attendre à lire les valeurs stockées dans Application["someKey"] avec WebConfigurationManager.AppSettings["someKey"].

+0

Darin, Merci d'avoir dit ça. Je me sens un peu stupide maintenant. Cependant, comment puis-je accéder à l'objet Application depuis l'extérieur du projet Web? –

+0

Vous ne pouvez pas. L'objet Application représente l'instance de votre application Web qui réside probablement dans un pool d'applications dans IIS, elle n'est donc accessible qu'à partir de l'application elle-même. AFAIK différents AppDomains/processus ne seront pas en mesure de lire/écrire sur cet objet. –

+0

Merci d'avoir redressé ma stupidité! Je l'ai corrigé avec 'ConfigurationManager.AppSettings.Set (appConfig.ConfigName, appConfig.ConfigValue);' –