Problema: recebo esta exceção "A CONEXÃO SUBJACENTE FOI FECHADA: UM ERRO INESPERADO OCORREU EM UM ENVIO" em meus registros e está interrompendo nossa integração de OEM com nosso sistema de e-mail marketing em horários aleatórios variando de [1 hora - 4 horas]
Meu site está hospedado em um servidor Windows 2008 R2 com IIS 7.5.7600. Este site possui um grande número de componentes OEM e um painel abrangente. Tudo funciona bem com todos os outros elementos do site, exceto com um de nossos componentes de marketing por e-mail, que estamos usando como uma solução iframe em nosso painel. Funciona assim: envio um objeto httpWebRequest com todas as credenciais e recebo de volta um url que coloquei em um iframe e funciona. Mas isso só funciona por algum tempo [1 hora - 4 horas] e então eu obtenho a exceção abaixo "A CONEXÃO SUBJACENTE FOI FECHADA: UM ERRO INESPERADO OCORREU EM UM ENVIO" e mesmo se o sistema tentar obter o URL do httpWebRequest falha com a mesma exceção. A única maneira de fazê-lo funcionar novamente é reciclar o pool de aplicativos ou qualquer coisa é editada em web.config.
Opção tentada
Adicionado explicitamente, keep-alive = false
keep-alive = true
Aumento do tempo limite: <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />
Eu carreguei esta página para um site não SSL para verificar se o certificado SSL em nosso servidor de produção está fazendo a conexão para cair de alguma forma.
Qualquer direção para a resolução é muito apreciada.
Código:
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`