Каков последовательный способ получения AppSettings, который отвечает за applicationHost.config? - PullRequest
0 голосов
/ 17 декабря 2010

Итак, appSettings можно установить в app.config, web.config, machine, config ... Но, когда вы работаете в IIS 7, вы можете также применять appSettings в applicationHost.config с определенным вырезом длясайт.Итак, какой последовательный способ для меня знать, какие AppSettings я должен использовать ???

System.Configuration.ConfigurationManager подойдет, если это профиль клиента.System.Web.Configuration.WebConfigurationManager, если это веб-приложение ... ну, может быть.Microsoft.Web.Administration, если я ожидаю значения в applicationHosting.config - ой ... и даже тогда они не сворачиваются иерархически, так что кажется, что вы оставили этот процесс.

Есть ли у кого-нибудьпоследовательный подход к обработке AppSettings, который учитывает applicationHost.config?

Ответы [ 2 ]

1 голос
/ 18 декабря 2010

Вы не можете указать <appSettings> в вашем applicationHost.config файле. Это связано с тем, что applicationHost.config определяет настройки, относящиеся только к IIS. Вы можете просмотреть схему applicationHost.config, чтобы подтвердить это:

%systemroot%\System32\inetsrv\config\schema\IIS_schema.xml

Если вы попытаетесь отредактировать applicationHost.config и добавить раздел <appSetting> на сайт или в раздел <location path="...">, вы получите ошибку (IIS может не запуститься, и консоль IIS MMC отобразит ошибку конфигурации).

Если вы настраиваете глобальный параметр приложения в диспетчере IIS, он фактически настраивается в основном файле web.config, который соответствует настройке версии .NET Framework по умолчанию в IIS.

<appSettings/> относится к .NET Framework и может быть настроен только в:

%SYSTEMROOT%\Microsoft.NET\Framework\[framework version]\CONFIG\machine.config
%SYSTEMROOT%\Microsoft.NET\Framework\[framework version]\CONFIG\web.config
%SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\CONFIG\machine.config
%SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\CONFIG\web.config

и, конечно, файлы app.config или web.config вашего приложения.

Я бы посоветовал сохранить эти настройки локально для вашего приложения, за исключением тех редких случаев, когда вам нужно, чтобы какое-то значение было доступно глобально.

Обновление:

Теперь, когда я понимаю вашу проблему - у вас есть несколько сайтов IIS, которые все указывают на одну и ту же физическую папку - есть способ приблизиться к этому.

В вашей базе данных может быть таблица конфигурации, в которой первичный ключ равен значению HTTP_HOST. Это соответствует префиксу, например:

Host               SitePrefix
====               ======
domain1.com        D001
domain2.com        D002

В вашем web.config:

В событии Application_Start вашего приложения в Global.asax.cs инициализируйте значение всего приложения:

void Application_Start(object sender, EventArgs e)
{
    // Code that runs on application startup
    string httpHost = HttpContext.Current.Request.ServerVariables["HTTP_HOST"];
    Application["SitePrefix"] = GetSiteKeyFromDb(httpHost);
}

Это значение будет доступно во всем приложении, но уникально для сайта.

Когда вам нужно прочитать настройку, относящуюся к сайту:

string siteSetting = ConfigurationManager.AppSettings[
    HttpContext.Current.Application["SitePrefix"] + "_Setting1"
];

Но если вы нажимаете на базу данных в Application_Start, тогда может быть целесообразно сохранить все эти специфичные для сайта настройки в базе данных, а затем читать и кэшировать их в Application вместо использования <appSettings />.

0 голосов
/ 26 апреля 2017

Я использовал информацию, предоставленную ответом Анти-Санты , чтобы выполнить это, но я не хотел анализировать URL-адрес и иметь другую базу данных для поиска информации.Та же самая кодовая база используется локально, и у меня не было бы этих частей в этом сценарии.

Просто добавьте appSettings в .NET Framework web.config с узлом location.

В %SYSTEMROOT%\Microsoft.NET\Framework64\[framework version]\Config\web.config добавьте следующее, где Site1 и Site2 - мои два приложения, указывающие на один и тот же физический каталог:

<?xml version="1.0" encoding="utf-8"?>
<!-- the root web configuration file -->
<configuration>

    <!-- App settings for the different applications -->
    <location path="Default Web Site/Site1">
        <appSettings>
            <add key="ConnectionString" value="the cnn str"/>
        </appSettings>
    </location>
    <location path="Default Web Site/Site2">
        <appSettings>
            <add key="ConnectionString" value="the cnn str"/>
        </appSettings>
    </location>

...

</configuration> 

web.config в физической папкепереопределит это appSetting, поэтому мне также нужно было удалить его из этого файла.

...