ADO.Netアプリケーションは、ローカルネットワーク上の別のサーバーにしか接続できない場合があります。特定の接続試行が成功するか失敗するかはランダムに見えます。接続は、次の形式の接続文字列を使用しています。
Server = THESERVER\TheInstance; Database = TheDatabase; User Id = TheUser; Password = ThePassword;
返されるエラーは次のとおりです。
接続タイムアウトが期限切れです。事前ログインハンドシェイク確認応答を消費しようとしたときにタイムアウト期間が経過しました。
これは、ログイン前のハンドシェイクが失敗したか、サーバーが時間内に応答できなかったことが原因である可能性があります。
このサーバーへの接続試行に費やされた時間は-[ログイン前]初期化= 42030;ハンドシェイク= 0;
.NETアプリケーションは、次のコードを実行する小さなテストアプリです。
using (SqlConnection conn = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM TheTable", conn))
{
conn.Open();
int rowCount = (int)cmd.ExecuteScalar();
}
TheTableは小さく、わずか78行です。
ただし、.NETアプリケーションがこのエラーを受け取る同じマシンでは、SSMSと接続文字列で指定されたユーザーID /パスワードを使用してTHESERVERに接続できます。
ADO.Netアプリからの接続が失敗するのに、SSMSからの同一の資格情報で成功するのはなぜですか?
THESERVER
のIPv6アドレスではなく、IPv4アドレスに対してTCP/IPが有効になっていることが判明しました。
どうやらいくつかの接続試行は最終的にIPv4を使用し、他の接続試行はIPv6を使用したようです。
両方のIPバージョンでTCP/IPを有効にすると、問題が解決しました。
SSMSが機能したという事実は偶然であることが判明しました(最初の数回の試行では、おそらくIPv4が使用されました)。後でSSMSを介して接続しようとすると、同じエラーメッセージが表示されました。
追加のIPアドレスに対してTCP/IPを有効にするには:
Iveは、Microsoftの最新の更新プログラム(2016年9月2日)に疑いの余地がある同じエラーが発生しました。 ASP.NETアプリケーションが「ログイン前のハンドシェイク確認応答を消費しようとしてタイムアウト期間が経過しました」というエラーを返している間に、SSMSが問題なく接続していることがわかりました。
私にとっての解決策は、接続文字列に30秒の接続タイムアウトを追加することでした。例:
ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"
私の状況では、影響を受ける接続は統合セキュリティを使用する接続のみで、接続する前にユーザーになりすましていましたが、SQL認証を使用する同じサーバーへの他の接続は正常に機能しました!
2つのテストシステム(個別のクライアントとSQLサーバー)が同時に影響を受け、Microsoftの更新プログラムが疑われるようになりました。
私はエリックのような問題を解決しましたが、他のいくつかの変更を加えました:
そして
エンティティデータモデルのセットアップ中に、Visual Studioからローカルネットワーク(VPN経由)のサーバーに接続しようとすると、同じ問題が発生しました。
接続文字列にTransparentNetworkIPResolution=false
を設定するだけで解決できました。 VS接続の追加ウィザードでは、[詳細設定]タブで見つけることができます。
ホストされたサーバーへの接続時に同じハンドシェイクの問題が発生しました。
ネットワークと共有センターを開き、ワイヤレスネットワーク接続でIPv6を有効にしました。
.NET Framework 3.5を使用してビルドされた実行可能ファイルは、一部のWindows Updateが最近インストールされてから(2017年8月7日の週)約半分の時間でこれらの接続の問題を報告し始めました。
接続エラーは、ターゲットコンピューターにインストールされた.NET Framework 4.7が原因で発生しました(Windows Updateの自動インストールがオンになっていた)- https://support.Microsoft.com/?kbid=3186539
.NET Framework 4.7をアンインストールすると、接続の問題が解決しました。
どうやら、.Net Framework 4.6.1に重大な変更があります- TransparentNetworkIPResolution 記事ごとに接続文字列を更新すると、フレームワークのバージョンをロールバックすることなく問題が解決しました。
IPv6を有効にし、受信ポート1433のブロックを解除することにより、Windows Server 2012およびSQL Server 2012でこのエラーを修正しました。
私のように問題を解決する時間を失う前に、Windowsマシンを再起動するを試してください。他のすべてのソリューションを適用した後、私のために働いた。
このケースでは、可用性クラスターの構成が原因で問題が発生しました。この問題を解決するには、接続文字列でMultiSubnetFailover
をTrueに設定する必要がありました。
MSDN の詳細
私にとっては、WindowsサーバーのファイアウォールがデフォルトのSQLサーバーポートであるポート1433をブロックしていたことがわかりました。そのため、これらの接続を受け入れるためのインバウンドルールを追加することが、私にとっての秘madeとなりました。
ユーザーアカウントをブルートフォースしようとしたIPアドレスをブロック/ブラックリスト化することで、この問題を解決しました。多数の失敗したログイン試行についてSQLアクセスログを確認します(通常は「sa」アカウントの場合)。
SharePoint 2010から2013への移行を行ったときに、この問題が発生しました。データベースサーバーは、IP6をルーティングしないファイアウォールの反対側にあるため、データベースへの接続時にIP6を使用しようとして失敗したのではないかと考えました。
この問題は解決されたと思います。エラーが停止したようです。私がやったのは、SharePoint ServerのネットワークアダプターのIP6を無効にするだけです(チェックを外すことで)。
これと同じ問題がありましたが、静的IPアドレスを使用してリモートデータベースに接続していました。したがって、上記の解決策のいずれも私の問題を解決しませんでした。
使用しているセキュリティログイン用の適切なユーザーマッピングを追加できなかったため、解決策は、ユーザーマッピング設定がデータベースにアクセスするように設定することだけでした。
抜本的なことを行う前に、まず簡単なSQL Serverの再起動を試します。それを修正するかもしれません。それは私のためにした
私の場合、接続文字列にユーザーとパスワードを含むパラメーターPersist Security Info=true
が問題の原因です。パラメーターを削除するか、false
に設定すると、問題が解決します。
「接続タイムアウトの期限切れ」エラーは、一般的に次の場合に発生します
上記の理由に基づいてこのエラーを追跡する方法を確認するには、 接続タイムアウトが期限切れです。ログイン前のハンドシェイク確認応答を消費しようとしたときに経過したタイムアウト期間