web-dev-qa-db-ja.com

ログイン前のハンドシェイク中にエラーが発生しました

これを重複としてマークする前に、全体をお読みください。

デバッグしているプロジェクトで、次のようなSqlExceptionを受け取ります。

追加情報:サーバーとの接続は正常に確立されましたが、ログイン前のハンドシェイク中にエラーが発生しました。 (プロバイダー:SSLプロバイダー、エラー:0-待機操作がタイムアウトしました。)

これは、前のセッションが数秒前に問題なく実行されたデバッグセッション中に発生しました。最初の例外以来、このプロジェクトではデータベースサーバーに接続できません。 SqlConnection.Open()メソッド呼び出しで例外がスローされます。

背景

これを受け取ったのはこれが初めてではありません。以前は2週間も苦労し、最終的にはMicrosoftサポートチケットを開始しました。その場合、接続文字列のApplicationNameプロパティが長すぎる(完全修飾のアセンブリ名を使用していた)ことがわかり、これを短くすると問題が緩和されました。

今回は、

  • ApplicationName値が指定されていません
  • WinSocksはデフォルトの状態です
  • ウイルス対策(ESET)が無効になっていて、問題ではなかった。
  • 機能しているデバッグセッションと機能していないデバッグセッションの間に何もインストールされていません

最後に、気まぐれで、同じSQLサーバーに接続することだけを目的とした新しいプロジェクトを作成しました。動作していないプロジェクトの接続文字列を新しいプロジェクトにコピーし、接続します。ある種のプロジェクトごとの接続キャッシュが行われていますか? Clean> RebuildおよびVisual StudioとWindowsの再起動後も存続するものはありますか?

関連コード

    public SqlConnection OpenSqlConnection(string connectionString)
    {
        var conn = new SqlConnection(connectionString);
        conn.Open();
        _connectionString = connectionString;
        var sb = new SqlConnectionStringBuilder(_connectionString);
        _server = sb.DataSource;
        _database = sb.InitialCatalog;
        return conn;
    }

渡される接続文字列は、アプリケーションの他の場所にあるSqlConnectionStringBuilderから出力されます。接続文字列は次のようになります:"Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=True;Connect Timeout=60"

12
CodeWarrior

したがって、この問題は私を悩ませ続け、ホームネットワーク(私はリモート開発者です)およびVPN経由でアクセスされる仕事用ネットワークからの遅延の関数であるように見えます。仕事用ネットワーク上のサーバーへの平均ping時間が100ミリ秒です。

本当の奇妙な点は、接続文字列が数か月間問題なく機能し、その後突然停止したことです。当時、アプリケーション名の値はApplication Name = "MyProgram.DAL。Culture = en、PublicKeyToken = 1a1a1a1a1a1a1a1a、Version = 1.0.0.0"のようなものでした。つまり、完全修飾されたアセンブリ名です。結局、これを短縮された「MyProgram.DAL」タイプ名に変更し、再び機能しました。

数ヶ月後、再び私はそれに悩まされました。そして、私はたまたま例外を食べて、いくつかのティックを待っていれば、すべてが問題なかったことがわかりました。失敗したと報告されていても、アプリケーションは喜んで接続を使用します。したがって、私はメソッドを以下に変更しました:

    public SqlConnection OpenSqlConnection(string connectionString)
    {
        var conn = new SqlConnection(connectionString);
        var retries = 10;
        while (conn.State != ConnectionState.Open && retries > 0)
        {
            try
            {
                conn.Open();
            }
            catch (Exception)
            {

            }
            Thread.Sleep(500);
            retries--;
        }

        _connectionString = connectionString;
        var sb = new SqlConnectionStringBuilder(_connectionString);
        _server = sb.DataSource;
        _database = sb.InitialCatalog;
        return conn;
    }
0
CodeWarrior

接続文字列にApplication Name=MyAppName;を明示的に追加してみてください。アセンブリ名から自動生成された値が制限を超えている可能性があります。

明示的に制限されたフレームサイズなどのネットワーク設定を確認してください。 SQL Serverが別のマシンで実行されている場合は、ルーターを再起動します。

接続文字列にPooling=False;を追加して、アプリケーションの再起動時に接続が繰り返されるという問題が解決するかどうかを確認してください。

2
Y.B.

私にとってのトリックは、接続文字列のタイムアウトを増やすことです。vpnで接続すると、接続の確立に時間がかかりました。これを行うには、;接続タイムアウト=値を追加します

VPNを使用しているときにアプリケーションを接続しようとすると、SQLサーバーに接続しようとしたときに同じエラーが発生しました。

デフォルトでは、タイムアウトは15秒に設定されています。

あなたはすでに60秒を持っているようです、おそらくあなたはもっともっと必要です...

それが役に立てば幸い!

1
StefanE

この問題は、SSLインスペクションを実行している途中のファイアウォールに関連している可能性があります。

SSLインスペクションを実行していない別の接続を使用して再試行するか、接続しているソースまたは宛先、あるいはその両方の除外を作成するようにファイアウォール管理者に依頼することをお勧めします。

乾杯!

1
procloudadmin