webentwicklung-frage-antwort-db.com.de

C # HttpWebRequest Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten

Ich habe gegoogelt und alle Lösungen ausprobiert, die ich finden oder mir vorstellen konnte. Auf der Website, die ich zu laden versuche, wird TLS1.2 ausgeführt, ebenso wie auf einigen anderen Websites, mit denen ich getestet habe, um sicherzustellen, dass es sich nicht um ein TLS1.2-Problem handelt. Die anderen Seiten wurden gut geladen.

byte[] buffer = Encoding.ASCII.GetBytes(
    "mod=www&ssl=1&dest=account_settings.ws"
    + "&username=" + username.Replace(" ", "20%")
    + "&password=" + password.Replace(" ", "20%"));

ServicePointManager.MaxServicePointIdleTime = 1000;
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

HttpWebRequest WebReq =
    (HttpWebRequest)WebRequest.Create(
        "https://secure.runescape.com/m=weblogin/login.ws");

WebReq.Method = "POST";
WebReq.KeepAlive = false;

WebReq.Referer =
    "https://secure.runescape.com/m=weblogin/loginform.ws"
    + "?mod=www&ssl=1&expired=0&dest=account_settings.ws";

WebReq.ContentType = "application/x-www-form-urlencoded";
WebReq.ContentLength = buffer.Length;
Stream PostData = WebReq.GetRequestStream();
PostData.Write(buffer, 0, buffer.Length);
PostData.Close();
HttpWebResponse WebResp = (HttpWebResponse)WebReq.GetResponse();
Stream Answer = WebResp.GetResponseStream();
StreamReader _Answer = new StreamReader(Answer);
reply = _Answer.ReadToEnd();
curAccount++;
if (reply.Contains("Login Successful"))
{
     eturn true;
}
else
{
     eturn false;
}

Egal was ich versuche, ich bekomme immer die Ausnahme

Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten.

Unter mehr Details habe ich gefunden

Die Authentifizierung ist fehlgeschlagen, da die Gegenstelle den Transportstrom geschlossen hat.

28
Rob

In der 4.0-Version des .Net-Frameworks wird ServicePointManager.SecurityProtocol nur angeboten zwei Optionen einstellen:

  • SSL3: Secure Socket Layer (SSL) 3.0-Sicherheitsprotokoll.
  • Tls: TLS 1.0-Sicherheitsprotokoll (Transport Layer Security)

In der nächsten Version des Frameworks wurde der Enumerator SecurityProtocolType um die neueren Tls-Protokolle erweitert. Wenn Ihre Anwendung also die Version 4.5 verwenden kann, können Sie auch Folgendes verwenden:

  • Tls11: Gibt das Transport Layer Security (TLS) 1.1-Sicherheitsprotokoll an
  • Tls12: Gibt das Transport Layer Security (TLS) 1.2-Sicherheitsprotokoll an.

Wenn Sie also auf .Net 4.5 sind, ändern Sie Ihre Leitung

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls;

zu

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

damit erstellt der ServicePointManager Streams, die TLS12-Verbindungen unterstützen.

Beachten Sie, dass die Aufzählungswerte als Flags verwendet werden können, sodass Sie mehrere Protokolle mit einem logischen ODER kombinieren können

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | 
                                       SecurityProtocolType.Tls11 |
                                       SecurityProtocolType.Tls12;

Hinweis
Versuchen Sie, die Anzahl der von Ihnen unterstützten Protokolle so gering wie möglich und mit den heutigen Sicherheitsstandards auf dem neuesten Stand zu halten. Ssll3 gilt nicht mehr als sicher und die Verwendung von Tls1.0 SecurityProtocolType.Tls ist im Abstieg.

84
rene

Ich habe diese Ausnahme erlebt und sie hing auch mit ServicePointManager.SecurityProtocol Zusammen.

Für mich lag dies daran, dass ServicePointManager.SecurityProtocol Auf Tls | Tls11 Gesetzt wurde (aufgrund bestimmter Websites, die die Anwendung mit defektem TLS 1.2 aufruft) und beim Besuch einer Website, die nur TLS 1.2 enthält (getestet mit SSLLabs 'SSL Report ), es ist fehlgeschlagen.

Eine Option für .NET 4.5 und höher ist die Aktivierung aller TLS-Versionen:

ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
                                     | SecurityProtocolType.Tls11
                                     | SecurityProtocolType.Tls12;
15
Simon Shine

Code für WebTestPlugIn

public class Protocols : WebTestPlugin
{

    public override void PreRequest(object sender, PreRequestEventArgs e)
    {
        ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;

    }

}
1
venkata ravi