Не удается получить доступ к SQL Azure DB с веб-сайта Azure, хотя эта же строка подключения работает с локального веб-сайта

Недавно я создал свой первый сайт на Azure. На данный момент это в основном стандартный веб-сайт MVC4 с контроллерами Home и Account. В Azure у меня есть один веб-сайт и одна база данных SQL. Я могу получить доступ к базе данных SQL Azure из SSMS и настроить имя пользователя и пользователя, которые будут использоваться моим сайтом.

В моей среде разработки, указывая на мою базу данных разработки, я могу получить доступ к странице /Account/Login в порядке. Я могу зарегистрироваться, и я вижу нового пользователя в моем локальном db. Я также могу изменить строку подключения, чтобы указать мой сайт разработки на моем SQL Azure DB, и снова я могу получить доступ /Account/Login и зарегистрировать новых пользователей. Затем я могу увидеть этих новых пользователей в SQL Azure DB.

Проблемы возникают при развертывании веб-сайта в Azure. У меня есть конфигурация преобразования, связанная с моим файлом публикации, и я могу видеть в окне вывода при публикации сайта Azure, что это преобразование применяется во время развертывания. Это изменяет строку подключения базы данных локального развития к строке соединения SQL Azure. Я также подтвердил, что эта строка соединения SQL Azure находится в фактическом файле web.config, развернутом (используя FileZilla FTP для извлечения фактического развертывания web.config). Я могу получить доступ к домашней странице моего сайта на [mysite].AzureWebsites.net, но когда я нажимаю ссылку для входа на страницу /Account/Login, я получаю следующую ошибку:

[ArgumentException: Format of the initialization string does not conform to specification starting at index 0.]
System.Data.Common.DbConnectionOptions.GetKeyValuePair(String connectionString, Int32 currentPosition, StringBuilder buffer, Boolean useOdbcRules, String& keyname, String& keyvalue) +5313265
System.Data.Common.DbConnectionOptions.ParseInternal(Hashtable parsetable, String connectionString, Boolean buildChain, Hashtable synonyms, Boolean firstKey) +124
System.Data.Common.DbConnectionOptions..ctor(String connectionString, Hashtable synonyms, Boolean useOdbcRules) +95
System.Data.SqlClient.SqlConnectionString..ctor(String connectionString) +59
System.Data.SqlClient.SqlConnectionFactory.CreateConnectionOptions(String connectionString, DbConnectionOptions previous) +24
System.Data.ProviderBase.DbConnectionFactory.GetConnectionPoolGroup(DbConnectionPoolKey key, DbConnectionPoolGroupOptions poolOptions, DbConnectionOptions& userConnectionOptions) +167
System.Data.SqlClient.SqlConnection.ConnectionString_Set(DbConnectionPoolKey key) +61
System.Data.SqlClient.SqlConnection.set_ConnectionString(String value) +66

System.Data.Entity.Internal.LazyInternalConnection.InitializeFromConnectionStringSetting(ConnectionStringSettings appConfigConnection) +122
System.Data.Entity.Internal.LazyInternalConnection.TryInitializeFromAppConfig(String name, AppConfig config) +32
System.Data.Entity.Internal.LazyInternalConnection.Initialize() +127
System.Data.Entity.Internal.LazyInternalConnection.get_ProviderName() +13
System.Data.Entity.Internal.LazyInternalContext.InitializeContext() +346
System.Data.Entity.Internal.InternalContext.CreateObjectContextForDdlOps() +17
System.Data.Entity.Database.Exists() +36
[MyWebsite].Filters.SimpleMembershipInitializer..ctor() +105

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

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

Я также попытался добавить строку соединения SQL Azure через портал Azure Management (хотя я не видел, как указать провайдера) - само собой разумеется, я получил тот же "Формат инициализации...", исключение, упомянутое выше.

Моя строка подключения в файле web.config имеет следующий формат:

<add name="[my connection name]"
     connectionString="Server=tcp:abc123.database.windows.net,1433;Database=[my database];User ID=[my login]@abc123;Password=[my password];Trusted_Connection=False;Encrypt=True;Connection Timeout=30;" 
     providerName="System.Data.SqlClient" />

Любые предложения были бы очень желанными.

Ответ 1

Я НАКОНЕЦ добрался до конца. То, что я до сих пор не понял, было то, что в web.config было 2 строки соединения, которые в конечном итоге развертываются на веб-сайте Windows Azure - моя собственная пользовательская, но другая строка соединения по умолчанию, которая имеет формат:

<add name="DefaultConnection" connectionString="DefaultConnection_ConnectionString" providerName="System.Data.SqlClient" />
  • очевидно, не допустимая строка соединения (и, следовательно, исключение формата выше). Вы можете увидеть это при загрузке фактического web.config с вашего сайта Azure с помощью FTP.

Эта строка подключения по умолчанию не имеет значения в web.configs или различных преобразованиях в моем решении. Посмотрев окно вывода во время публикации, существует ряд преобразований, которые применяются к web.config. Я просмотрел различные версии файлов, которые генерируются во время цикла сборки/публикации, и ни одна из них не имеет в них строку соединения DefaultConnection, даже в папке obj\Release\Package\PackageTmp \. Поэтому я предполагаю, что что-то на этапе Web Deploy вставляет его как самую последнюю модификацию web.config. В файле publishsettings есть элемент MSDeployParameterValue, в котором упоминаются строки подключения и файл web.config - я думаю, это может быть так.

В файле AccountModels.cs в этот DefaultConnection делается ссылка:

public UsersContext()
: base("DefaultConnection")
{
}

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

Ответ 2

Я знаю, что это старый пост, но я хотел поделиться своими выводами. В моем .pubxml файле он сохранил строку подключения localdb и не обновлялся ни в каких сборках, ни при публикации. Я должен был вручную обновить файл публикации с помощью строк подключения к Azzure DB, чтобы он работал. Надеюсь, это поможет сэкономить время.

Ответ 3

О строках подключения SQL Azure

  • Служба базы данных SQL Azure доступна только с TCP-портом 1433. Убедитесь, что ваш брандмауэр разрешает исходящую TCP-связь через TCP-порт 1433.

  • SQL Azure не поддерживает проверку подлинности Windows. Надежное соединение всегда будет установлено на False.

  • SQL Azure не поддерживает незашифрованные соединения. Вам нужно указать в строке подключения, которую вы хотите зашифровать.

  • Подключение к SQL Azure с помощью OLE DB официально не поддерживается.

Стандартный способ

Server=tcp:[serverName].database.windows.net;Database=myDataBase;
User ID=[LoginForDb]@[serverName];Password=myPassword;Trusted_Connection=False;Encrypt=True;

Используйте "имя пользователя @имя_сервера" для параметра "Идентификатор пользователя".

Для получения дополнительной информации проверьте это Строки подключения для SQL Azure

Надеюсь, это поможет вам.

Ответ 4

Попробуйте удалить "Encrypt = True"; или попробуйте добавить "TrustServerCertificate = True"; - Для получения более подробной информации прочтите Свойство SqlConnection.ConnectionString, но в основном:

Начиная с .NET Framework 4.5, когда TrustServerCertificate является ложным (по умолчанию) и Шифрование истинно, имя сервера (или IP-адрес) в SQL Server Сертификат SSL должен точно соответствовать имени сервера (или IP-адресу) указанный в строке подключения.