Problem: Ich erhalte die Ausnahme "Die zugrunde liegende Verbindung wurde geschlossen: Ein unerwarteter Fehler trat bei einem Versand auf" in meinen Protokollen und es bricht unsere OEM-Integration in unser E-Mail-Marketing-System zu zufälligen Zeiten zwischen [1 Stunde - 4 Stunden].
Meine Website wird auf einem Windows Server 2008 R2 mit IIS 7.5.7600 gehostet. Diese Website enthält eine große Anzahl von OEM-Komponenten und ein umfassendes Dashboard. Mit allen anderen Elementen der Website funktioniert alles einwandfrei, mit Ausnahme einer unserer E-Mail-Marketing-Komponenten, die wir als Iframe-Lösung in unserem Dashboard verwenden. Die Art und Weise, wie es funktioniert, ist, ich sende ein httpWebRequestobject mit allen Anmeldeinformationen und ich bekomme eine URL zurück, die ich in einen Iframe eingefügt habe und es funktioniert. Aber es funktioniert nur für einige Zeit [1 Stunde - 4 Stunden] und dann erhalte ich die folgende Ausnahme: "Die zugrunde liegende Verbindung wurde geschlossen: Ein unerwarteter Fehler trat beim Senden auf" und selbst wenn das System versucht, die URL von httpWebRequest abzurufen schlägt mit der gleichen Ausnahme fehl. Die einzige Möglichkeit, es wieder zum Laufen zu bringen, besteht darin, den Anwendungspool zu recyceln oder irgendetwas in web.config zu bearbeiten.
Option ausprobiert
Explizit hinzugefügt, keep-alive = false
keep-alive = true
Erhöhte die Auszeit: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />
Ich habe diese Seite auf eine Nicht-SSL-Website hochgeladen, um zu überprüfen, ob das SSL-Zertifikat auf unserem Produktionsserver die Verbindung herstellt, um einige Schritte zu trennen.
Jede Richtung zur Auflösung wird sehr geschätzt.
Code:
Public Function CreateHttpRequestJson(ByVal url) As String
Try
Dim result As String = String.Empty
Dim httpWebRequest = DirectCast(WebRequest.Create("https://api.xxxxxxxxxxx.com/api/v3/externalsession.json"), HttpWebRequest)
httpWebRequest.ContentType = "text/json"
httpWebRequest.Method = "PUT"
httpWebRequest.ContentType = "application/x-www-form-urlencoded"
httpWebRequest.KeepAlive = False
'ServicePointManager.SecurityProtocol = SecurityProtocolType.Ssl3
'TODO change the integratorID to the serviceproviders account Id, useremail
Using streamWriter = New StreamWriter(httpWebRequest.GetRequestStream())
Dim json As String = New JavaScriptSerializer().Serialize(New With { _
Key .Email = useremail, _
Key .Chrome = "None", _
Key .Url = url, _
Key .IntegratorID = userIntegratorID, _
Key .ClientID = clientIdGlobal _
})
'TODO move it to the web.config, Following API Key is holonis accounts API Key
SetBasicAuthHeader(httpWebRequest, holonisApiKey, "")
streamWriter.Write(json)
streamWriter.Flush()
streamWriter.Close()
Dim httpResponse = DirectCast(httpWebRequest.GetResponse(), HttpWebResponse)
Using streamReader = New StreamReader(httpResponse.GetResponseStream())
result = streamReader.ReadToEnd()
result = result.Split(New [Char]() {":"})(2)
result = "https:" & result.Substring(0, result.Length - 2)
End Using
End Using
Me.midFrame.Attributes("src") = result
Catch ex As Exception
objLog.WriteLog("Error:" & ex.Message)
If (ex.Message.ToString().Contains("Invalid Email")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Email Taken")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Invalid Access Level")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Unsafe Password")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Invalid Password")) Then
'TODO Show message on UI
ElseIf (ex.Message.ToString().Contains("Empty Person Name")) Then
'TODO Show message on UI
End If
End Try
End Function
Public Sub SetBasicAuthHeader(ByVal request As WebRequest, ByVal userName As [String], ByVal userPassword As [String])
Dim authInfo As String = Convert.ToString(userName) & ":" & Convert.ToString(userPassword)
authInfo = Convert.ToBase64String(Encoding.[Default].GetBytes(authInfo))
request.Headers("Authorization") = "Basic " & authInfo
End Sub`
quelle
Antworten:
Für mich war es tls12:
quelle
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
System.Net.ServicePointManager.SecurityProtocol |= SecurityProtocolType.Tls12;
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12 -bor [Net.SecurityProtocolType]::Tls11 -bor [Net.SecurityProtocolType]::Tls
Wenn Sie mit .Net 4.0 nicht weiterkommen und die Zielwebsite TLS 1.2 verwendet, benötigen Sie stattdessen die folgende Zeile.
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
Quelle: TLS 1.2- und .NET-Unterstützung: So vermeiden Sie Verbindungsfehler
quelle
(SecurityProtocolType)768
für "Tls11" (dh TLS 1.1) verwendet werden kann.Der folgende Code hat das Problem behoben
quelle
ServicePointManager.SecurityProtocol
es sich um ein statisches Objekt handelt. Dies bedeutet, dass das Ändern dieses Werts alle TeilsequenzenWebRequest
oderWebClient
Aufrufe beeinflusst. Sie können separate Einstellungen vornehmen ,AppDomain
wenn SieServicePointManager
andere Einstellungen vornehmen möchten . Weitere Informationen finden Sie unter stackoverflow.com/questions/3791629/… .Ich habe seit Tagen das gleiche Problem mit einer Integration, die auch "früher nur funktioniert hat".
Aus purer Depression habe ich es einfach versucht
Dies löste es für mich. Auch wenn die Integration ausschließlich SSLv3 verwendet.
Ich kam zu der Erkenntnis, dass etwas nicht stimmt, seit Fiddler berichtet hat, dass es eine "leere TLS-Verhandlungs-Chiffre" oder ähnliches gibt.
Hoffentlich funktioniert es!
quelle
In meinem Fall wurde die Site, zu der ich eine Verbindung herstelle, auf TLS 1.2 aktualisiert. Infolgedessen musste ich .net 4.5.2 auf meinem Webserver installieren, um dies zu unterstützen.
quelle
Gehen Sie zu Ihrer web.config / App.config, um zu überprüfen, welche .net-Laufzeit Sie verwenden
Hier ist die Lösung:
.NET 4.6 und höher. Sie müssen keine zusätzlichen Arbeiten ausführen, um TLS 1.2 zu unterstützen. Es wird standardmäßig unterstützt.
.NET 4.5. TLS 1.2 wird unterstützt, ist jedoch kein Standardprotokoll. Sie müssen sich anmelden, um es zu verwenden. Der folgende Code macht TLS 1.2 zum Standard. Stellen Sie sicher, dass Sie es ausführen, bevor Sie eine Verbindung zu einer gesicherten Ressource herstellen:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
quelle
Ich habe festgestellt, dass dies ein Zeichen dafür ist, dass auf dem Server, auf dem Sie Code bereitstellen, ein altes .NET-Framework installiert ist, das TLS 1.1 oder TLS 1.2 nicht unterstützt. Zu behebende Schritte:
Sie können das neueste .NET Developer Pack und Runtime unter folgender URL herunterladen : http://getdotnet.azurewebsites.net/target-dotnet-platforms.html
quelle
Wir hatten dieses Problem, bei dem eine Website, die auf unsere API zugegriffen hat, die Meldung "Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten." Botschaft.
Ihr Code war eine Mischung aus .NET 3.x und 2.2, was meines Wissens bedeutet, dass sie TLS 1.0 verwenden.
Die folgende Antwort kann Ihnen bei der Diagnose des Problems helfen, indem Sie TLS 1.0, SSL 2 und SSL3 aktivieren. Um jedoch ganz klar zu sein, möchten Sie dies nicht langfristig tun, da alle drei dieser Protokolle als unsicher angesehen werden und nicht länger gelten sollten verwendet :
Damit unser IIS auf seine API-Aufrufe reagiert, mussten wir Registrierungseinstellungen auf dem IIS-Server hinzufügen, um Versionen von TLS explizit zu aktivieren. HINWEIS: Sie müssen den Windows-Server (nicht nur den IIS-Dienst) neu starten, nachdem Sie diese Änderungen vorgenommen haben:
Wenn dies nicht der Fall ist, können Sie auch mit dem Hinzufügen des Eintrags für SSL 2.0 experimentieren:
Um es klar auszudrücken, ist dies keine gute Lösung , und die richtige Lösung besteht darin, den Anrufer dazu zu bringen, TLS 1.2 zu verwenden. Das oben Gesagte kann jedoch bei der Diagnose helfen, dass dies das Problem ist.
Mit diesem Powershell-Skript können Sie das Hinzufügen dieser Registrierungseinträge beschleunigen:
Dies ist eine modifizierte Version des Skripts auf der Microsoft-Hilfeseite zum Einrichten von TLS für VMM . Dieser Basics.net-Artikel war die Seite, auf der ich ursprünglich auf die Idee gekommen bin , mir diese Einstellungen anzusehen.
quelle
Einfach hinzufügen:
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
quelle
Wenn es jemandem hilft, war unser Problem mit dem fehlenden Zertifikat. Die Umgebung ist Windows Server 2016 Standard mit .Net 4.6.
Es gibt einen selbst gehosteten WCF-Dienst https URI, für den Service.Open () fehlerfrei ausgeführt wird. Ein anderer Thread würde weiterhin auf https: // OurIp: 443 / OurService? Wsdl zugreifen, um sicherzustellen, dass der Dienst verfügbar ist. Der Zugriff auf die WSDL schlug fehl mit:
Die zugrunde liegende Verbindung wurde geschlossen: Beim Senden ist ein unerwarteter Fehler aufgetreten.
Die Verwendung von ServicePointManager.SecurityProtocol mit den entsprechenden Einstellungen hat nicht funktioniert. Das Spielen mit Serverrollen und -funktionen hat ebenfalls nicht geholfen. Dann trat Jaise George , die SE, ein und löste das Problem in ein paar Minuten. Jaise installierte ein selbstsigniertes Zertifikat im IIS, um das Problem zu beheben. Dies ist, was er getan hat, um das Problem anzugehen:
(1) Öffnen Sie den IIS-Manager (inetmgr). (2) Klicken Sie im linken Bereich auf den Serverknoten und doppelklicken Sie auf "Serverzertifikate". (3) Klicken Sie im rechten Bereich auf "Selbstsigniertes Zertifikat erstellen" und geben Sie den gewünschten Anzeigenamen ein. (4) Klicken Sie im linken Bereich auf "Standardwebsite", im rechten Bereich auf "Bindungen", klicken Sie auf "Hinzufügen", wählen Sie "https", wählen Sie das soeben erstellte Zertifikat aus und klicken Sie auf "OK". (5) Zugriff Über die https-URL sollte darauf zugegriffen werden können.
quelle
Sie ändern einfach Ihre Anwendungsversion wie 4.0 auf 4.6 und veröffentlichen diesen Code.
Fügen Sie auch die folgenden Codezeilen hinzu:
quelle
Die Verwendung eines HTTP-Debugging-Proxys kann dies verursachen - beispielsweise Fiddler.
Ich habe ein PFX-Zertifikat aus einer lokalen Datei geladen (Authentifizierung bei Apple.com) und es ist fehlgeschlagen, weil Fiddler dieses Zertifikat nicht weitergeben konnte.
Versuchen Sie, Fiddler zu deaktivieren, um zu überprüfen, ob dies die Lösung ist. Dann müssen Sie wahrscheinlich das Zertifikat auf Ihrem Computer installieren oder auf eine Weise, die Fiddler verwenden kann.
quelle
Der folgende Code hat mein Problem gelöst:
quelle