128 votes

La connexion au serveur SQL fonctionne parfois

Une application ADO.Net n'est que parfois capable de se connecter à un autre serveur sur le réseau local. Il semble aléatoire qu'une tentative de connexion donnée réussisse ou échoue. La connexion utilise une chaîne de connexion de la forme :

Serveur=THESERVER \TheInstance ;Database=TheDatabase;User Id=TheUser ; Password=ThePassword ;

l'erreur retournée est :

Le délai de connexion a expiré. Le délai d'attente s'est écoulé lors de la tentative de consommation de l'accusé de réception de la poignée de main de pré-connexion.
Cela peut être dû au fait que la poignée de main de pré-connexion a échoué ou que le serveur n'a pas pu répondre à temps.
La durée de la tentative de connexion à ce serveur est de - [Pre-Login] initialization=42030 ; handshake=0 ;

L'application .NET est une petite application de test qui exécute le code suivant :

using (SqlConnection conn = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM TheTable", conn))
{
    conn.Open();
    int rowCount = (int)cmd.ExecuteScalar();
}

LeTableau est petit, seulement 78 rangs.

Cependant, sur le même machine Lorsque l'application .NET reçoit cette erreur, je peux me connecter à THESERVER à l'aide de SSMS et de l'ID utilisateur/mot de passe indiqué dans la chaîne de connexion.

Pourquoi la connexion peut-elle échouer à partir d'une application ADO.Net, mais réussir avec des informations d'identification identiques à partir de SSMS ?

110voto

Eric J. Points 73338

Il s'est avéré que TCP/IP était activé pour l'adresse IPv4, mais pas pour l'adresse IPv6, de THESERVER .

Apparemment, certaines tentatives de connexion ont fini par utiliser l'IPv4 et d'autres l'IPv6.

L'activation de TCP/IP pour les deux versions IP a résolu le problème.

Le fait que SSMS ait fonctionné s'est avéré être une coïncidence (les premières tentatives ont vraisemblablement utilisé IPv4). Quelques tentatives ultérieures de connexion via SSMS ont donné lieu au même message d'erreur.

Pour activer le TCP/IP pour des adresses IP supplémentaires :

  • Démarrer le gestionnaire de configuration du serveur Sql
  • Ouvrez le nœud Configuration du réseau du serveur SQL
  • Protocoles de clic gauche pour MYSQLINSTANCE
  • Dans le volet de droite, cliquez avec le bouton droit de la souris sur TCP/IP.
  • Cliquez sur Propriétés
  • Sélectionnez l'onglet Adresses IP
  • Pour chaque adresse IP répertoriée, assurez-vous que Active et Activé sont tous les deux Oui.

46voto

Shaun Keon Points 1

Je viens d'avoir la même erreur qui s'est alignée de façon suspecte avec la dernière série de mises à jour de Microsoft (09/02/2016). J'ai constaté que SSMS s'est connecté sans problème alors que mon application ASP.NET a renvoyé l'erreur "timeout period elapsed while attempting to consume the pre-login handshake acknowledgement" .

La solution pour moi a été d'ajouter un délai de connexion de 30 secondes dans la chaîne de connexion, par exemple :

ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"

Dans ma situation, la seule connexion affectée était celle qui utilisait la sécurité intégrée et je me faisais passer pour un utilisateur avant de me connecter, les autres connexions au même serveur utilisant l'authentification SQL fonctionnaient bien !

2 systèmes de test (clients et serveurs Sql distincts) ont été affectés en même temps, ce qui me fait soupçonner une mise à jour de Microsoft !

20voto

Renzo Ciot Points 426

J'ai résolu le problème comme Eric mais avec quelques autres changements :

  • Démarrer le gestionnaire de configuration du serveur Sql
  • Ouvrez le nœud Configuration du réseau du serveur SQL
  • Protocoles de clic gauche pour MYSQLINSTANCE
  • Dans le volet de droite, cliquez avec le bouton droit de la souris sur TCP/IP.
  • Cliquez sur Propriétés
  • Sélectionnez l'onglet Adresses IP
  • Pour chaque adresse IP répertoriée, assurez-vous que Active et Activé sont tous les deux Oui.

ET

  • Pour chaque adresse IP répertoriée, assurez-vous que TCP Dynamic Ports est vide et que TCP Port = 1433 (ou un autre port).
  • Ouvrez le pare-feu de Windows et vérifiez que le port est ouvert dans les connexions entrantes.

14voto

maozx Points 31

J'ai eu le même problème, en essayant de me connecter à un serveur dans un réseau local (via VPN) à partir de Visual Studio, tout en configurant un modèle de données d'entité.
J'ai réussi à le résoudre uniquement en mettant TransparentNetworkIPResolution=false dans la chaîne de connexion. Dans l'assistant d'ajout de connexion VS, vous pouvez le trouver dans l'onglet Avancé.

6voto

Pomster Points 1531

J'ai eu le même problème de poignée de main lors de la connexion à un serveur hébergé.

J'ai ouvert mon centre de réseau et de partage et activé l'IPv6 sur ma connexion réseau sans fil.

enter image description here

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X