11

最近、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" />

どんな提案でも大歓迎です。

4

4 に答える 4

7

私はついにその底にたどり着きました。今まで気がつかなかったのは、最終的に Windows Azure Web サイトに展開される web.config に 2 つの接続文字列があることでした。独自のカスタム接続文字列ですが、別の DefaultConnection 接続文字列もあり、次の形式になっています。

<add name="DefaultConnection" connectionString="DefaultConnection_ConnectionString" providerName="System.Data.SqlClient" />
  • 明らかに、有効な接続文字列ではありません (したがって、上記の形式の例外)。これは、FTP を使用して Azure Web サイトから実際の web.config をダウンロードすると確認できます。

この既定の接続文字列は、web.configs または私のソリューションのさまざまな変換のどこにもありません。パブリッシュ中に [出力] ウィンドウを見ると、web.config に適用される多くの変換があります。ビルド/公開サイクル中に生成されるさまざまなバージョンのファイルを確認しましたが、obj\Release\Package\PackageTmp\ フォルダーであっても、DefaultConnection 接続文字列が含まれているファイルはありません。したがって、Web Deploy フェーズの何かが web.config の最後の変更としてそれを挿入していると推測しています。publishsettings ファイルには、接続文字列と web.config について言及している MSDeployParameterValue 要素があります。

AccountModels.cs ファイルでは、この DefaultConnection への参照が作成されます。

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

これは、特定の接続文字列が選択される方法です。このパラメーターをカスタム接続文字列名に変更すると、カスタム データベースがさまざまなアカウントに使用され、上記の形式の例外が解決されます。

于 2013-02-05T21:32:46.380 に答える
2

これが古い投稿であることは承知していますが、調査結果を共有したかったのです。私の .pubxml ファイルには、localdb 接続文字列が保存されており、ビルドや公開時に更新されませんでした。パブリッシュ ファイルを機能させるには、azure DB 接続文字列を使用して手動で更新する必要がありました。これが誰かの時間を節約するのに役立つことを願っています.

于 2015-12-29T18:28:01.503 に答える
0

SQLAzureの接続文字列について

  • SQL Azureデータベースサービスは、TCPポート1433でのみ使用できます。ファイアウォールがTCPポート1433での発信TCP通信を許可していることを確認してください。

  • SQLAzureはWindows認証をサポートしていません。信頼できる接続は常にFalseに設定されます。

  • SQL Azureは、暗号化されていない接続をサポートしていません。接続を暗号化することを接続文字列で指定する必要があります。

  • OLEDBを使用したSQLAzureへの接続は、公式にはサポートされていません。

標準的な方法

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

ユーザーIDパラメーターには「username@servername」を使用します。

詳細については、SQLAzureの接続文字列を確認してください。

これがお役に立てば幸いです。

于 2013-02-03T17:08:30.183 に答える
-1

「Encrypt=True;」を削除してみてください。または、「TrustServerCertificate=True;」を追加してみてください。-詳細については、 SqlConnection.ConnectionString プロパティを参照してください。ただし、基本的には次のとおりです。

.NET Framework 4.5 以降、TrustServerCertificate が false (既定値) で Encrypt が true の場合、SQL Server SSL 証明書のサーバー名 (または IP アドレス) は、接続文字列で指定されたサーバー名 (または IP アドレス) と正確に一致する必要があります。 .

于 2013-02-03T16:38:27.933 に答える