2013-02-03 19 views
10

Ho recentemente impostato il mio primo sito Web su Azure. Per ora, è fondamentalmente solo il sito Web standard di MVC4 con i controller Home e Account. In Azure, ho un sito Web e un database SQL. Posso accedere al database SQL Azure da SSMS e configurare un account utente e un accesso da utilizzare dal mio sito web.Impossibile accedere al database SQL di Azure dal sito Web di Azure anche se la stessa stringa di connessione funziona dal sito Web locale

Nel mio ambiente di sviluppo, indicando il mio database di sviluppo, posso accedere alla pagina/Account/Login. Posso registrarmi e posso vedere il nuovo utente nel mio db locale. Posso anche cambiare la stringa di connessione per indirizzare il mio sito web di sviluppo nel mio DB SQL di Azure, e di nuovo posso accedere a/Account/Login e registrare nuovi utenti. Posso quindi vedere quei nuovi utenti nel database SQL di Azure.

I problemi si verificano quando distribuisco il sito Web in Azure. Ho una configurazione di trasformazione associata al mio file delle impostazioni di pubblicazione e posso vedere nella finestra di output quando si pubblica il sito in Azure che questa trasformazione viene applicata durante la distribuzione. Questo modifica la stringa di connessione del DB di sviluppo locale alla stringa di connessione di SQL Azure. Ho anche verificato che questa stringa di connessione SQL Azure si trovi nel file web.config attualmente distribuito (utilizzando FileZilla FTP per recuperare l'effettivo web.config distribuito). Posso accedere alla home page del mio sito su [mysite] .AzureWebsites.net, ma quando clicco sul link di accesso per andare alla pagina/account/Login, ottengo il seguente errore:

[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 

Questo sembra suggerire che c'è un problema con la mia stringa di connessione, ma come ho detto prima, questa stessa stringa di connessione funzionava dal mio sito web locale.

Ho considerato che il problema potrebbe essere relativo al firewall, ma ho controllato le impostazioni nel portale di gestione di Azure e la regola del firewall di Windows Azure Services viene applicata per consentire tale accesso. Inoltre, ho provato a rimuovere la regola del firewall per il mio computer locale per accedere al database SQL di Azure, per vedere avrei ottenuto un'eccezione simile, ma l'eccezione generata era ovviamente legata al firewall.

Ho anche provato ad aggiungere la stringa di connessione SQL Azure tramite il portale di gestione di Azure (anche se non ho visto come specificare il provider) - inutile dire che ho ottenuto lo stesso "Formato dell'inizializzazione ... "eccezione menzionata sopra.

mia stringa di connessione nel web.config è nel seguente formato:

<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" /> 

Qualsiasi suggerimento sarebbe molto gradita.

risposta

7

Ho FINALMENTE finito in fondo. Quello che non avevo realizzato fino ad ora era che ci fossero 2 stringhe di connessione nel web.config che alla fine venissero implementate sul sito Web di Windows Azure: la mia personalizzata, ma anche un'altra stringa di connessione DefaultConnection, che ha il formato:

<add name="DefaultConnection" connectionString="DefaultConnection_ConnectionString" providerName="System.Data.SqlClient" /> 
  • ovviamente, non una stringa di connessione valida (e quindi l'eccezione di formato sopra). È possibile vederlo quando si scarica il web.config dal proprio sito Web di Azure tramite FTP.

Questa stringa di connessione predefinita non è da nessuna parte nel web.configs o in varie trasformazioni nella mia soluzione. Osservando la finestra Output durante la pubblicazione, ci sono un certo numero di trasformazioni che vengono applicate a web.config. Ho esaminato le varie versioni dei file generati durante il ciclo di generazione/pubblicazione e nessuno di essi contiene la stringa di connessione DefaultConnection, nemmeno nella cartella obj \ Release \ Package \ PackageTmp \. Quindi immagino che qualcosa nella fase di distribuzione del web lo stia inserendo come ultima modifica di web.config. Esiste un elemento MSDeployParameterValue nel file publishsettings che menziona le stringhe di connessione e il web.config. Suppongo che potrebbe essere quello.

Nel file AccountModels.cs, si fa riferimento a questo DefaultConnection:

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

questo modo viene scelta la stringa di connessione particolare. La modifica di questo parametro nel nome della stringa di connessione personalizzata garantisce l'utilizzo del database personalizzato per i vari elementi dell'account e risolve l'eccezione di formato vista in precedenza.

+0

Nice catch sul costruttore UsersContext. –

+0

Si sta utilizzando l'aggiornamento del database di distribuzione Web? C'è una casella di controllo se vuoi aggiungere la stringa di connessione al progetto. – kvetis

-1

Provare a rimuovere "Encrypt = True;" oppure prova ad aggiungere "TrustServerCertificate = True;" - Leggere SqlConnection.ConnectionString Property per maggiori dettagli, ma in fondo:

Beginning in .NET Framework 4.5, when TrustServerCertificate is false (the default) and Encrypt is true, the server name (or IP address) in a SQL Server SSL certificate must exactly match the server name (or IP address) specified in the connection string.

+0

Purtroppo, nessuna di queste opzioni ha funzionato, viperguynaz. Ma ora vedo come la stessa stringa di connessione potrebbe funzionare localmente ma non dal sito Web ospitato da Azure. Avrò una lettura del link che hai postato per vedere se c'è qualcos'altro che potrei provare. Grazie per l'aiuto! –

0

Circa le stringhe di connessione di SQL Azure

  • Il servizio di database di SQL Azure è disponibile solo con la porta TCP 1433. verificare che il firewall consente la comunicazione TCP in uscita sulla porta TCP 1433.

  • SQL Azure non supporta l'autenticazione di Windows. La connessione sicura sarà sempre impostata su False.

  • SQL Azure non supporta connessioni non crittografate. È necessario specificare nella stringa di connessione che si desidera crittografare la connessione.

  • Connessione a SQL Azure utilizzando OLE DB non è ufficialmente supportato.

modo standard

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

Use '[email protected]' for the User ID parameter.

Per maggiori informazioni controllare questo fuori Connection strings for SQL Azure

Spero che questo vi aiuterà a voi.

+0

Grazie per la tua risposta, Sampath, ma penso che la stringa di connessione che ho pubblicato sopra soddisfi tutti questi criteri. Inoltre, la stessa stringa di connessione funziona bene quando viene usata dal mio database locale, il che suggerisce che non c'è niente di sbagliato nella stringa di connessione. Inoltre, poiché mi sto connettendo al database SQL Azure da un sito Web ospitato su Azure, non ho alcun controllo sulle porte nelle regole del firewall: questa non è un'opzione nel portale di gestione di Windows Azure, non una che io possa vedere comunque . Darei comunque un'occhiata al collegamento che hai postato. Grazie Sampath! –

1

So che questo è un vecchio post, ma volevo condividere le mie scoperte. Nel mio file .pubxml, memorizzava la mia stringa di connessione localdb e non si aggiornava su nessuna build o pubblicazione. Ho dovuto aggiornare manualmente il file di pubblicazione con le stringhe di connessione del mio DB azzurro affinché funzioni. Spero che questo aiuti a risparmiare tempo a qualcuno.

Problemi correlati