最近、Azure で最初の Web サイトをセットアップしました。今のところ、これは基本的に、Home コントローラーと Account コントローラーを備えた標準の MVC4 テンプレート Web サイトです。Azure には、1 つの Web サイトと 1 つの SQL データベースがあります。SSMS から SQL Azure データベースにアクセスでき、Web サイトで使用するログインとユーザーを設定しました。
私の開発環境では、私の開発データベースを指して、/Account/Login ページに問題なくアクセスできます。登録でき、ローカル データベースで新しいユーザーを確認できます。接続文字列を変更して、開発 Web サイトが SQL Azure DB を指すようにすることもできます。また、/Account/Login にアクセスして、新しいユーザーを登録することもできます。その後、SQL Azure DB でそれらの新しいユーザーを確認できます。
Web サイトを Azure にデプロイすると、問題が発生します。publishsettings ファイルに関連付けられた変換構成があり、サイトを Azure に発行するときに出力ウィンドウで、デプロイ中にこの変換が適用されることを確認できます。これにより、ローカル開発 DB 接続文字列が 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
これは、接続文字列に問題があることを示唆しているようですが、前述したように、これとまったく同じ接続文字列がローカル Web サイトから機能していました。
問題はファイアウォールに関連している可能性があると考えましたが、Azure 管理ポータルで設定を確認したところ、そのアクセスを許可するように Windows Azure サービスのファイアウォール ルールが適用されています。また、ローカル マシンが SQL Azure DB にアクセスするためのファイアウォール ルールを削除して、同様の例外が発生するかどうかを確認しましたが、スローされた例外は明らかにファイアウォールに関連していました。
また、Azure 管理ポータルを介して SQL Azure 接続文字列を追加しようとしました (ただし、プロバイダーを指定する方法はわかりませんでした) - 言うまでもなく、上記と同じ「初期化のフォーマット...」例外が発生しました。 .
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" />
どんな提案でも大歓迎です。