2009-10-17 3 views
0

У меня появляется странная проблема, когда в моем приложении global.asax в моем приложении Application_Start() у меня есть что-то, что уходит в мою базу данных, получает все настройки моего приложения от имени/value, а затем помещает их в приложение через Application.Add(name,value).Проблемы с извлечением наборов приложений, добавленных во время запуска приложения

У меня есть «фасад приложения» в другом проекте, который используется моими уровнями обслуживания, слоями данных и т. Д., Чтобы получить настройки. Мне нужно делать разные кусочки.

В моей базе данных, у меня есть несколько записей:

ConfigName   | ConfigValue 
WebServiceUsername | myUsername 
WebServicePassword | myPassword 

Так что в моем методе, я пойти и получить эти значения из базы данных, и поместить их в моем приложении:

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); 
    } 
} 

Это, как я называю значение из приложения на более позднее время:

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

Это то, где все становится странно ,

Если я позвоню фасад приложения из моего веб-слоя с этим: (! Да, я попытался просто ConfigurationManager в методе GET)

<%= ApplicationFacade.WebServiceUsername %> 

я ничего не получаю обратно.

Но это странно ...

Если я вручную поместить ключ приложения в мой файл web.config ...

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

А затем построить аналогичное свойство в моем классе ApplicationFacade как Putz, когда я делаю вызов в представлении (<%= ApplicationFacade.Putz %>), я возвращаю 'mash'.

Итак, я знаю, что приложение ApplicationFacade работает правильно. Может, это мой код в application_start()?

Ну, если я положил это на мой взгляд <%=Application["WebServiceUsername"]%>, myUsername.

Что дает ?!

Ответ

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

ответ

3

В Application_Start, когда вы обратитесь к Application объекту это на самом деле является экземпляром HttpApplicationState, который используется для хранения приложений определенных настроек в памяти и не имеет ничего общего с значением ключа AppSettings/хранится в web.config.

  • При использовании WebConfigurationManager.AppSettings["someKey"] это будет возвращать значение, соответствующее someKey в appSettings разделе web.config.
  • При использовании Application["someKey"] это вернет значение, кэшированное в экземпляре приложения.

Оба не имеют никакого отношения, и вы не можете ожидать, чтобы читать значения, хранящиеся в Application["someKey"] с WebConfigurationManager.AppSettings["someKey"].

+0

Дарин, благодарю вас за это. Сейчас я чувствую себя немного глупо. Однако как я могу получить доступ к объекту приложения за пределами веб-проекта? –

+0

Вы не можете. Объект Application представляет экземпляр вашего веб-приложения, который, вероятно, живет внутри некоторого пула приложений в IIS, поэтому он доступен только из самого приложения. AFAIK различные приложения/процессы не смогут читать/записывать на этот объект. –

+0

Спасибо, что установили мою тупость прямо! Я исправил его с помощью команды ConfigurationManager.AppSettings.Set (appConfig.ConfigName, appConfig.ConfigValue); ' –