2015-09-14 2 views
2

У меня есть простое приложение ASP Web API 2, которое развертывается в Azure Web App. Он использует базу данных SQL, также размещенную на Azure. DbContext устанавливается с помощью Опубликовать диалоговое окно, как на рисунке ниже, так что я доверяю инструменты VS, и я предполагаю, что строка соединения правильно установить: (пример с последующим можно найти here)Asp Web Api развернутое соединение db

enter image description here

Соединение строка устанавливается на Web.config

<connectionStrings> 
    <add name="DefaultConnection" 
     connectionString="..." 
     providerName="System.Data.SqlClient"/> 
</connectionStrings> 

и используется в ctor из IdentityDbContext:

public ApplicationDbContext() : base("DefaultConnection") 

Когда проект API отлаживается локально, он может без проблем получить доступ к производственной базе данных, но после ее развертывания он больше не сможет получить к ней доступ. Ниже приведены исключения (отправленные обратно почтальону). Были и другие ответы на SO о подобных проблемах, но до сих пор мне это не удалось.

[Win32Exception (0x80004005): No such host is known] 

[SqlException (0x80131904): A network-related or instance-specific 
error occurred while establishing a connection to SQL Server. The 
server was not found or was not accessible. Verify that the instance 
name is correct and that SQL Server is configured to allow remote 
connections. (provider: TCP Provider, error: 0 - No such host is known.)] 
System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection, Action`1 wrapCloseInAction) +92 
System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj, Boolean callerHasConnectionLock, Boolean asyncClose) +285 
System.Data.SqlClient.TdsParser.Connect(ServerInfo serverInfo, SqlInternalConnectionTds connHandler, Boolean ignoreSniOpenTimeout, Int64 timerExpire, Boolean encrypt, Boolean trustServerCert, Boolean integratedSecurity, Boolean withFailover, SqlAuthenticationMethod authType) +372 
System.Data.SqlClient.SqlInternalConnectionTds.AttemptOneLogin(ServerInfo serverInfo, String newPassword, SecureString newSecurePassword, Boolean ignoreSniOpenTimeout, TimeoutTimer timeout, Boolean withFailover) +172 

[ProviderIncompatibleException: The provider did not return a ProviderManifestToken string.] 
System.Data.Entity.Core.Common.DbProviderServices.GetProviderManifestToken(DbConnection connection) +271 
System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection) +33 

[ProviderIncompatibleException: An error occurred accessing the database. This usually means that the connection to the database failed. Check that the connection string is correct and that the appropriate DbContext constructor is being used to specify it or find it in the application's config file. See http://go.microsoft.com/fwlink/?LinkId=386386 for information on DbContext and connections. See the inner exception for details of the failure.] 
System.Data.Entity.Utilities.DbProviderServicesExtensions.GetProviderManifestTokenChecked(DbProviderServices providerServices, DbConnection connection) +246 
System.Data.Entity.Infrastructure.<>c__DisplayClass1.<ResolveManifestToken>b__0(Tuple`3 k) +32 
System.Collections.Concurrent.ConcurrentDictionary`2.GetOrAdd(TKey key, Func`2 valueFactory) +72 
System.Data.Entity.Infrastructure.DefaultManifestTokenResolver.ResolveManifestToken(DbConnection connection) +251 
+1

Вы преобразования файлов конфигурации в зависимости от сборки конфигурации? – Marcus

+1

Нет, я отключил их, чтобы отладить эту проблему. – tomab

+1

Если вы можете убедиться, что строка подключения верна в рабочей среде, возможно, проблема связана с тем, что производственная БД недоступна из сетевого местоположения, к которому вы пытаетесь получить к нему доступ? Вы уверены в DNS, у вас нет записей в вашем файле 'hosts', указывающем на БД? – Marcus

ответ

1

Убедитесь, что ЖИВОЙ строка подключения является правильным

Перейти к http://myWebApp.scm.azurewebsites.net и выберите Консоль отладки>PowerShell. Затем запустите это, чтобы просмотреть строку подключения LIVE.

cd site/wwwroot 
$xml = [xml](Get-Content Web.config) 
$connStrings = $xml.SelectSingleNode("configuration/connectionStrings") 
$connStrings.InnerXml 

Убедитесь, что ваши правила брандмауэра являются правильными

Перейти к http://portal.azure.com, откройте сервер базы данных (ПРОСМОТРА ВСЕХ>Sql сервера>MYSERVER) и выберите Настройки . Под Брандмауэр гарантирует, что Разрешить доступ к Azure services is ON.

A picture of the new azure portal Firewall settings area.

Вы также можете сделать это с Azure PowerShell, как это:

Get-AzureAccount        # sign-in to your account 
Get-AzureResource -ResourceGroupName mvp2015 ` 
    -ResourceName mvp2015 ` 
    -ResourceType Microsoft.Sql/servers/firewallrules ` 
    -OutputObjectFormat New 

Если вы видите правило с именем AllowAllWindowsAzureIps тогда вы уже настроены должным образом.

Проверьте ваш веб-конфигурации App

Вы можете быть перекрывая Web.config в конфигурации Web App.

Вы можете это проверить на портале.azure.com> Обзор всех> MyAppName> Настройки> Настройки приложения> Строки подключения. Если у вас есть имя DefaultConnection, оно переопределит строку подключения Web.config.

Вы также можете проверить это на myappname.scm.azurewebsites.net> Environment> Connection Strings. Убедитесь, что перечисленные там DefaultConnection, если вообще есть, являются тем, кем вы хотите.

Kudu Connection Strings

+1

Спасибо за советы. К сожалению, строковое соединение правильное и установлены разрешения. – tomab

+1

Действительно, в строках соединения myappname.scm.azurewebsites.net есть старая DefaultConnection. Какая конфигурация веб-приложения устанавливает эту строку подключения? – tomab

+0

Обычно вы можете найти переопределения строки подключения в portal.azure.com> Browse All> MyAppName> Настройки> Параметры приложения> Строки подключения. –

Смежные вопросы