Сценарий: я переношу приложение в облако. У меня есть соединение с базой данных, определенное в моем файле web.config, в котором используется локальная база данных SQL Server, и я хотел бы переместить его в веб-роль в Windows Azure и использовать базу данных SQL Azure. Основной процесс — добавить проект развертывания Windows Azure в решение, которое содержит мое веб-приложение. Затем я перемещаю свою базу данных в SQL Azure (с помощью мастера миграции SQL Azure), а затем меняю строку подключения, чтобы она указывала на облачную базу данных. За исключением того, что после того, как я развернул проект, мне, возможно, придется изменить место нахождения базы данных.
Попробуйте Azure бесплатно — активируйте 90-дневную пробную версию на
http://aka.ms/AzureTrialMB
сегодня!
Поскольку эта информация хранится в Web.config, все, что мне нужно сделать, — это повторно развернуть новый файл web.config в веб-роли, и мы готовы к работе. К сожалению, это, вероятно, означает обновление приложения или VIP-своп, что не так уж и плохо, но я знаю, что могу вносить изменения в файл ServiceConfiguration и распространять изменения в запущенных экземплярах … без простоев. Но как мне изменить конфигурацию сервиса на web.config?
Ранее я уже писал о том, как можно зашифровать информацию, хранящуюся в файле web.config во время события Session_Start, добавив код в файл Global.asax для проверки раздела, а затем вызвать функцию защиты. Если я могу добавить некоторый код, чтобы определить, запущен ли я в Azure, и если мне нужно прочитать настройки из файла ServiceConfiguration, то у нас все будет хорошо. Как и в примере с параметрами шифрования, подход, который хорошо работает, заключается в добавлении кода в событие Session_Start. Для моего примера я создал параметр в роли Windows Azure для dbConnectionString и установил для него значение, которое я хотел бы использовать.
Далее я обязательно добавлю ссылку на Microsoft. Пространство имен WindowsAzure.ServiceRuntime добавлено в веб-проект, чтобы я мог получить доступ к информации о роли. Если у меня его еще нет, я добавляю файл global.asax в свой веб-проект. В этом месте я могу добавить код для событий, которые периодически происходят на протяжении жизненного цикла моего приложения. Я решил использовать Session_Start, потому что, если я внес изменения в мой файл ServiceDefinition, они будут применены при следующем посещении моего сайта.
public string dbConnectionString { get; set; } void Session_Start(object sender, EventArgs e) { // Are we running in Azure? if (RoleEnvironment.IsAvailable == true) { dbConnectionString = RoleEnvironment.GetConfigurationSettingValue("dbConnectionString"); // Do we have a value for the alternate dbConnectionString in the ServiceConfiguraiton file? if (dbConnectionString != null) { Configuration myConfig = WebConfigurationManager.OpenWebConfiguration("~"); ConnectionStringsSection mySection = myConfig.GetSection("connectionStrings") as ConnectionStringsSection; if (mySection != null) { if (mySection.ConnectionStrings["myDBConnectionString"].ConnectionString != dbConnectionString) { mySection.ConnectionStrings["myDBConnectionString"].ConnectionString = dbConnectionString; myConfig.Save(ConfigurationSaveMode.Modified, true); } } } } }
Я проверяю, отличается ли значение в файле конфигурации службы от значения в моем файле web.config, и если это так, внесите изменение и сохраните его. Первоначально, когда я тестировал код, я получил ошибку «конфигурация доступна только для чтения», но, добавив опцию для метода Save, она работает. Теперь я могу обновить строку подключения к базе данных из файла конфигурации службы и передать ее в мой web.config запущенного приложения.
Кредит идет туда, где он должен, и Бинг указал мне на несколько сообщений на эту тему, в том числе StackOverflow и DotNetCurry .