“底层连接已closures:发送时出现意外错误。”使用SSL证书

问题:我的日志中出现了“底层连接已closures:发送中出现意外错误”的例外情况,随机时间从[1小时至4小时]不等,打破了与我们的电子邮件营销系统的OEM集成。

我的网站托pipe在IIS 7.5.7600的Windows Server 2008 R2上。 本网站有大量的OEM组件和综合仪表板。 一切工作正常与网站的所有其他元素,除了我们的电子邮件营销组件之一,我们正在使用我们的仪表板内的iframe解决scheme。 它的工作方式是,我发送一个httpWebRequest对象的所有凭据,我得到一个url,我把它放在一个iframe,它的工作原理。 但它只能工作一段时间[1小时 – 4小时],然后我得到下面的exception“下面的连接已closures:发送意外的错误”,即使系统试图从httpWebRequest获取URL失败,同样的例外。 再次使用它的唯一方法是回收应用程序池,或者在web.config中编辑任何东西。 我真的用尽了所有我能想到的select。

选项尝试

显式添加, keep-alive = false

keep-alive = true

增加超时: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />

我已经将此页面上传到非SSL网站,以检查我们的生产服务器上的SSL证书是否正在使连接丢失一些方法。

任何方向的解决scheme是非常感激。

代码:

 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` 

对我来说,这是tls12:

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12; 

如果您使用.Net 4.0并且目标站点正在使用TLS 1.2,则需要使用以下行。 ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;

来源: TLS 1.2和.NET支持:如何避免连接错误

下面的代码解决了这个问题

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3 

在我的情况下,我连接到的网站已升级到TLS 1.2。 因此,我不得不在我的Web服务器上安装.net 4.5.2以支持它。

我已经有了几天的同样的问题,现在只有“以前工作过”的集成。

出于绝望的压抑,我只是试了一下

 ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3; 

这为我解决了。即使整合严格只使用SSLv3。

我意识到自从Fiddler报告说有一个“空的TLS协商密码”或类似的东西以后,有什么事情可以做。

希望它能起作用!

我发现这是一个迹象表明,您正在部署代码的服务器安装了旧的.NET框架,不支持TLS 1.1或TLS 1.2。 步骤来解决:

  1. 在生产服务器上安装最新的.NET 运行时 (IIS和SQL)
  2. 在开发机器上安装最新的.NET Developer Pack
  3. 将Visual Studio项目中的“目标框架”设置更改为最新的.NET框架。

你可以从这个URL获得最新的.NET Developer Pack和Runtime: http : //getdotnet.azurewebsites.net/target-dotnet-platforms.html