Problema: aparece esta excepción "LA CONEXIÓN SUBYACENTE SE CERRÓ: OCURRIÓ UN ERROR INESPERADO EN UN ENVÍO" en mis registros y está interrumpiendo nuestra integración OEM con nuestro sistema de marketing por correo electrónico en momentos aleatorios que varían de [1 hora a 4 horas]
Mi sitio web está alojado en un servidor Windows 2008 R2 con IIS 7.5.7600. Este sitio web tiene una gran cantidad de componentes OEM y un panel completo. Todo funciona bien con todos los demás elementos del sitio web, excepto con uno de nuestros componentes de marketing por correo electrónico que estamos utilizando como una solución de iframe dentro de nuestro panel de control. La forma en que funciona es, envío un httpWebRequestobject con todas las credenciales y obtengo una URL que puse en un iframe y funciona. Pero solo funciona durante un tiempo [1 hora - 4 horas] y luego obtengo la siguiente excepción "LA CONEXIÓN SUBYACENTE FUE CERRADA: OCURRIÓ UN ERROR INESPERADO EN UN ENVÍO" e incluso si el sistema intenta obtener la URL de httpWebRequest. falla con la misma excepción. La única forma de hacerlo funcionar de nuevo es reciclar el grupo de aplicaciones o cualquier cosa se edita en web.config.
Opción probada
Agregado explícitamente, keep-alive = false
keep-alive = true
Aumentó el tiempo de espera: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />
He subido esta página a un sitio web que no es SSL para comprobar si el certificado SSL en nuestro servidor de producción está haciendo que la conexión se caiga de alguna manera.
Cualquier dirección hacia la resolución es muy apreciada.
Codigo:
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`