web-dev-qa-db-fra.com

Une erreur s'est produite lors de la négociation préalable à la connexion.

S'il vous plaît lire dans son intégralité avant de marquer cela comme un doublon.

Dans un projet en cours de débogage, je reçois une exception SqlException disant ce qui suit:

Informations complémentaires: Une connexion a été établie avec le serveur, mais une erreur s'est produite lors de l'établissement de la connexion préalable à la connexion. (fournisseur: fournisseur SSL, erreur: 0 - l'opération d'attente a expiré.)

Cela s'est produit lors d'une session de débogage où la session précédente ne s'exécutait que quelques secondes auparavant sans problème. Depuis l'exception initiale, je ne parviens pas à me connecter au serveur de base de données dans ce projet. L'exception est levée sur l'appel de la méthode SqlConnection.Open ().

L'arrière-plan

Ce n'est pas la première fois que je reçois ceci. Auparavant, pendant deux semaines, j'avais du mal à l'installer, puis à lancer un ticket d'assistance Microsoft. Dans ce cas, il s'est avéré que la propriété ApplicationName sur la chaîne de connexion était trop longue (nous utilisions le nom d'assembly qualifié complet) et sa réduction a permis de résoudre le problème.

Cette fois-ci, il y a 

  • Aucune valeur ApplicationName fournie
  • WinSocks est dans son état par défaut
  • Antivirus (ESET) était désactivé et n'était pas le problème.
  • Rien n'a été installé entre une session de débogage active et non active

Enfin, sur un coup de tête, j'ai créé un nouveau projet dont le seul but était de se connecter à ce même serveur SQL. J'ai copié la chaîne de connexion du projet qui ne fonctionne pas dans le nouveau projet, qui se connecte. Existe-t-il une sorte de cache de connexion par projet en cours? Quelque chose survit à Nettoyer> Reconstruire et à un redémarrage de Visual Studio et Windows aussi?

Code pertinent

    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;
    }

La chaîne de connexion en cours de transmission est générée par un SqlConnectionStringBuilder situé ailleurs dans l'application. La chaîne de connexion est similaire à: "Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=True;Connect Timeout=60"

11
CodeWarrior

Ce qui a été le truc pour moi, c’est d’augmenter le délai d’attente de la chaîne de connexion, puisqu’il s’agissait d’une connexion par vpn d’établir la connexion. Vous pouvez le faire en ajoutant: délai de connexion = valeur

J'ai eu la même erreur lors de la connexion d'une application a essayé de se connecter au serveur SQL alors que j'étais sur un vpn.

Par défaut, le délai est défini sur 15 secondes.

On dirait que vous avez déjà 60 secondes, peut-être avez-vous besoin de plus ...

J'espère que ça aide!

1
StefanE

Essayez d'ajouter explicitement Application Name=MyAppName; à la chaîne de connexion. La valeur générée automatiquement à partir du nom de l'assembly peut dépasser certaines limites.

Vérifiez les paramètres réseau pour des éléments tels que la taille de trame explicitement limitée. Redémarrez le routeur si SQL Server est en cours d'exécution sur une autre machine.

Essayez d'ajouter Pooling=False; à la chaîne de connexion et de vérifier si cela résout le problème de connexions répétées au redémarrage de l'application.

2
Y.B.

Donc, ce problème a continué à me tourmenter et il semble que cela était dû au décalage de mon réseau domestique (je suis un développeur distant) et au réseau de travail accessible via un VPN. J'ai un temps de ping moyen de 100 ms sur les serveurs du réseau de travail.

La vraie bizarrerie est que la chaîne de connexion a fonctionné sans problème pendant des mois, puis s'est soudainement arrêtée. À ce moment-là, la valeur du nom de l'application ressemblait à Nom de l'application = "MonProgramme.DAL. Culture = en, PublicKeyToken = 1a1a1a1a1a1a1a1a, Version = 1.0.0.0". En d’autres termes, un nom d’assemblée qualifié complet. Finalement, j'ai changé cela en le nom de type abrégé "MyProgram.DAL" et cela a fonctionné à nouveau.

Quelques mois plus tard, encore une fois j'étais assailli par elle. Et il m'est arrivé de constater que si je mangeais l'exception et attendais quelques tics, tout allait bien. L'application utiliserait volontiers la connexion même si elle a signalé l'échec. Ainsi, j'ai changé la méthode à la suivante:

    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