web-dev-qa-db-ger.com

Fehler beim Handshake vor der Anmeldung

Bitte lies es vollständig durch, bevor du es als doppelt kennzeichnest.

In einem Projekt, das ich debuggen, erhalte ich eine SqlException mit folgendem Inhalt:

Zusätzliche Informationen: Es wurde eine Verbindung mit dem Server erfolgreich hergestellt. Beim Handshake vor der Anmeldung ist jedoch ein Fehler aufgetreten. (Anbieter: SSL-Anbieter, Fehler: 0 - Zeitüberschreitung beim Wartevorgang.)

Dies trat während einer Debugsitzung auf, bei der die vorherige Sitzung nur Sekunden zuvor ohne Probleme ausgeführt wurde. Seit der ersten Ausnahme kann ich in diesem Projekt keine Verbindung zum Datenbankserver herstellen. Die Ausnahme wird beim Aufruf der Methode SqlConnection.Open () ausgelöst.

Der Hintergrund

Dies ist nicht das erste Mal, dass ich dies erhalten habe. Zuvor hatte ich zwei Wochen lang Probleme damit gehabt und schließlich ein Microsoft-Support-Ticket dafür initiiert. In diesem Fall stellte sich heraus, dass die ApplicationName-Eigenschaft in der Verbindungszeichenfolge zu lang war (wir verwendeten den vollständig qualifizierten Assemblynamen), und das Problem wurde dadurch verkürzt.

Dieses Mal gibt es das 

  • Es wurde kein ApplicationName-Wert angegeben
  • WinSocks befindet sich im Standardzustand
  • Antivirus (ESET) wurde deaktiviert und war nicht das Problem.
  • Zwischen einer funktionierenden und einer nicht funktionierenden Debugsitzung wurde nichts installiert

Aus einer Laune heraus habe ich schließlich ein neues Projekt erstellt, dessen einziger Zweck darin bestand, eine Verbindung zu demselben SQL-Server herzustellen. Ich habe die Verbindungszeichenfolge aus dem nicht funktionierenden Projekt in das neue Projekt kopiert und es wird eine Verbindung hergestellt. Gibt es eine Art pro-Projekt-Verbindungs-Caching? Etwas, das ein Clean> Rebuild und einen Neustart von Visual Studio und Windows überlebt?

Relevanter Code

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

Die Verbindungszeichenfolge, die übergeben wird, wird von einem SqlConnectionStringBuilder an anderer Stelle in der Anwendung ausgegeben. Die Verbindungszeichenfolge ist ähnlich: "Data Source=SERVER;Initial Catalog=DATABASE;Integrated Security=True;Connect Timeout=60"

11
CodeWarrior

Der Trick für mich war, das Zeitlimit für die Verbindungszeichenfolge zu erhöhen, da beim Verbindungsaufbau über vpn der Verbindungsaufbau zu lange dauerte. Sie können dies tun, indem Sie: Verbindungs-Timeout = Wert hinzufügen

Ich habe die gleiche Fehlermeldung erhalten, als ich eine Verbindung zu einem SQL Server auf einer VPN-Verbindung herstellte.

Standardmäßig ist das Timeout auf 15 Sekunden eingestellt.

Scheint, du hast bereits 60 Sekunden, vielleicht brauchst du einfach mehr ...

Ich hoffe es hilft!

1
StefanE

Versuchen Sie, explizit Application Name=MyAppName; zur Verbindungszeichenfolge hinzuzufügen. Der automatisch erzeugte Wert aus dem Assemblynamen überschreitet möglicherweise eine bestimmte Grenze.

Überprüfen Sie die Netzwerkeinstellungen auf Dinge wie die ausdrücklich begrenzte Bildgröße. Starten Sie den Router neu, wenn SQL Server auf einem anderen Computer ausgeführt wird.

Fügen Sie der Verbindungszeichenfolge Pooling=False; hinzu, und prüfen Sie, ob dies das Problem mit wiederholten Verbindungen beim Neustart der Anwendung löst.

2
Y.B.

Dieses Problem kann mit einer Firewall in der Mitte zusammenhängen, die eine SSL-Überprüfung durchführt.

Ich schlage vor, Sie versuchen entweder erneut, eine andere Verbindung zu verwenden, die keine SSL-Prüfung durchführt, oder Sie bitten Ihren Firewall-Administrator, eine Ausnahme für die Quelle und/oder das Ziel zu erstellen, zu der bzw. dem Sie eine Verbindung herstellen.

Prost!

1
procloudadmin

Dieses Problem plagte mich also weiterhin und es schien, als sei dies eine Funktion der Verzögerung von meinem Heimnetzwerk (ich bin ein Remote-Entwickler) und dem Arbeitsnetzwerk, auf das über ein VPN zugegriffen wird. Ich habe eine durchschnittliche Ping-Zeit von 100ms an Server im Arbeitsnetzwerk.

Die eigentliche Kuriosität ist, dass die Verbindungszeichenfolge über Monate hinweg ohne Probleme funktionierte und dann plötzlich aufhörte. Zu dieser Zeit war der Wert des Anwendungsnamens so ähnlich wie Anwendungsname = "MyProgram.DAL. Culture = de, PublicKeyToken = 1a1a1a1a1a1a1a1a1a, Version = 1.0.0.0". Mit anderen Worten: ein vollständig qualifizierter Assemblyname. Irgendwann habe ich den verkürzten Typnamen "MyProgram.DAL" geändert und es hat wieder funktioniert.

Einige Monate später wurde ich wieder von ihm geplagt. Und ich stellte fest, dass alles gut war, wenn ich nur die Ausnahme gegessen und ein paar Ticks gewartet hatte. Die Anwendung würde die Verbindung gerne verwenden, obwohl sie den Fehler gemeldet hat. Daher habe ich die Methode folgendermaßen geändert:

    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