Статьи

Настройка строки подключения в Web.configat Runtime в Windows Azure

Сценарий: я переношу приложение в облако. У меня есть соединение с базой данных, определенное в моем файле 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 .