2017-11-11 19 views
0

ここでは奇妙なエラーがあります。 Entity Framework 6.2を使用しているASP.NET 4.6アプリケーションでは、SQL Azureデータベースにアクセスするときに「ログインが失敗しました」というメッセージが表示されます。エラーの原因は、Azureの階層を切り替えることです。なぜ私はエラーがキャッチされていないのですか?私たちが持っているすべてのSQL操作はtry ... catchブロック内にあります。エラーはブロックから脱落し、アプリケーションがクラッシュする直前にGlobals.asaxによってキャッチされます。 私たちは、私はそれを理解して、最初のエラーから少なくとも70秒間何もSQLの実行を10回再試行する、未処理の例外エラー - ユーザーのログインに失敗しました

SetExecutionStrategy("System.Data.SqlClient", Function() New SqlServer.SqlAzureExecutionStrategy(10, TimeSpan.FromSeconds(7))) 

を持っています。マイクロソフトの技術サポートによれば、まだSQL Azureに接続していないため、これは関与していません。 ConnectRetryCountと接続文字列の間隔は、サーバーと通信しているため適用されません。サーバーはちょうど、「あなたがそこにいることは知っていますが、私はあなたを入れるつもりはありません!」と言っています。 MSテクニカルサポートによれば、これを回避する唯一の方法は、私たちのすべてのSQLコマンドをtry ... catchブロックでブロックすることです。それだけで落ちて、アプリをクラッシュさせる!

globals.asaxで再試行できません。その時点で既にクラッシュしています。 MSによると、コンテキストでエラーをトラップしてそこから再試行する方法はありません。では、解決策は何ですか? 「アプリをクラッシュさせてページをリフレッシュさせてください」以外の答えが必要です。

ページが数秒後にリフレッシュされると、すべて正常です。エラーはなく、問題はありません。エラーを投げるコードの行のいずれかの

例:

MapTo = ctx.BrowserMaps.FirstOrDefault(Function(x) code.Contains(x.NameOrUserAgent)) 

それは本当に非常に単純です。このコードブロックが頻繁に呼び出されるため、このコードブロックは多く発生します。どの行が使用されていても、EF内での接続が失敗するため、実際のSQL要求は無関係です。

答えて

2

新しいティアにスケールアップ/ダウンしている間、サーバのログインが切断され、トランザクションがロールバックされます。ただし、含まれているデータベース・ログインはスケーリング・プロセス中に接続されたままです。そのため、サーバー・ログインよりも推奨されます。

エラー#0をキャプチャしている可能性があり、Azure SQLデータベースのエラーの多くがそのエラー0カテゴリに該当する可能性があるため、tryとcatchを使用しても問題が解決されない場合があります。

単なるコメントでは、スケーリング後のパフォーマンスがスケーリング直後に悪くなり、数分後に改善される可能性があります。クエリプランも変更される可能性があります。

+0

これは多かれ少なかれ答えです。このケースでは、モデルのコンストラクタにtry.catchを配置することで、再試行ロジックをいくつか設定することができました。データベースのログインを検討中です。ありがとうございます。 –

関連する問題