문제 : 내 로그에 “기본 연결이 닫혔습니다 : 전송시 예상치 못한 오류가 발생했습니다”라는 예외가 발생하고 [1 시간-4 시간]에서 임의의 시간에 OEM과 이메일 마케팅 시스템의 통합이 중단됩니다.
내 웹 사이트는 IIS 7.5.7600이 설치된 Windows Server 2008 R2에서 호스팅됩니다. 이 웹 사이트에는 많은 OEM 구성 요소와 포괄적 인 대시 보드가 있습니다. 대시 보드 내에서 iframe 솔루션으로 사용하는 이메일 마케팅 구성 요소 중 하나를 제외하고는 웹 사이트의 다른 모든 요소와 잘 작동합니다. 작동 방식은 모든 자격 증명과 함께 httpWebRequestobject를 보내고 iframe에 넣은 URL을 다시 얻습니다. 하지만 일정 시간 [1 시간-4 시간] 동안 만 작동하고 “기본 연결이 닫혔습니다 : 전송시 예기치 않은 오류가 발생했습니다”라는 예외가 발생하고 시스템이 httpWebRequest에서 URL을 가져 오려고 시도하더라도 동일한 예외로 실패합니다. 다시 작동하도록 만드는 유일한 방법은 응용 프로그램 풀을 재활용하는 것입니다. 그렇지 않으면 web.config에서 편집 할 수 있습니다.
시도한 옵션
명시 적으로 추가됨, keep-alive = false
keep-alive = true
시간 초과 증가 : <httpRuntime maxRequestLength="2097151" executionTimeout="9999999" enable="true" requestValidationMode="2.0" />
이 페이지를 SSL이 아닌 웹 사이트에 업로드하여 프로덕션 서버의 SSL 인증서가 연결을 끊고 있는지 확인했습니다.
해상도를 향한 모든 방향은 대단히 감사합니다.
코드 :
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;
답변
아래 코드로 문제가 해결되었습니다.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls Or SecurityProtocolType.Ssl3
답변
나는 “이전에 일했던”통합과 함께 며칠 동안 같은 문제를 겪어왔다.
순수한 우울증에서 난 그냥
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls | SecurityProtocolType.Ssl3;
이것은 통합이 엄격하게 SSLv3만을 사용하더라도 나를 위해 그것을 해결했습니다.
나는 Fiddler가 “빈 TLS 협상 암호”또는 이와 유사한 것이 있다고보고 한 이후로 뭔가 꺼져 있으면 뭔가를 깨달았습니다.
잘하면 작동합니다!
답변
제 경우에는 연결하려는 사이트가 TLS 1.2로 업그레이드되었습니다. 결과적으로 나는 그것을 지원하기 위해 웹 서버에 .net 4.5.2를 설치해야했다.
답변
web.config / App.config로 이동하여 사용중인 .net 런타임을 확인하십시오.
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.1" />
</startup>
해결책은 다음과 같습니다.
-
.NET 4.6 이상. TLS 1.2를 지원하기 위해 추가 작업을 수행 할 필요가 없으며 기본적으로 지원됩니다.
-
.NET 4.5. TLS 1.2가 지원되지만 기본 프로토콜은 아닙니다. 사용하려면 선택해야합니다. 다음 코드는 TLS 1.2를 기본값으로 설정하고 보안 리소스에 연결하기 전에 실행해야합니다.
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12
- .NET 4.0. TLS 1.2는 지원되지 않지만 시스템에 .NET 4.5 (또는 그 이상)가 설치되어있는 경우 애플리케이션 프레임 워크에서 지원하지 않더라도 TLS 1.2를 선택할 수 있습니다. 유일한 문제는 .NET 4.0의 SecurityProtocolType에 TLS1.2에 대한 항목이 없기 때문에이 열거 형 값의 숫자 표현을 사용해야한다는 것입니다.
ServicePointManager.SecurityProtocol = (SecurityProtocolType)3072;
- .NET 3.5 이하. TLS 1.2는 지원되지 않으며 (*) 해결 방법이 없습니다. 애플리케이션을 최신 버전의 프레임 워크로 업그레이드합니다.
답변
이것이 코드를 배포하는 서버에 TLS 1.1 또는 TLS 1.2를 지원하지 않는 오래된 .NET 프레임 워크가 설치되어 있다는 신호라는 것을 발견했습니다. 해결 단계 :
- 최신 .NET 런타임 설치프로덕션 서버 (IIS 및 SQL)에
- 개발 컴퓨터에 최신 .NET 개발자 팩 을 설치합니다 .
- Visual Studio 프로젝트의 “대상 프레임 워크”설정을 최신 .NET 프레임 워크로 변경합니다.
다음 URL에서 최신 .NET 개발자 팩 및 런타임을 얻을 수 있습니다. http://getdotnet.azurewebsites.net/target-dotnet-platforms.html