ADO.Net 응용 프로그램은 때때로 로컬 네트워크의 다른 서버에 연결할 수 있습니다. 주어진 연결 시도의 성공 여부는 무작위로 보입니다. 연결은 다음 형식의 연결 문자열을 사용합니다.
서버 = THESERVER \ TheInstance; Database = TheDatabase; User Id = TheUser; Password = ThePassword;
반환 된 오류는 다음과 같습니다.
연결 시간이 만료되었습니다. 사전 로그인 핸드 셰이크 승인을 사용하는 동안 시간 초과 기간이 경과했습니다.
사전 로그인 핸드 셰이크가 실패했거나 서버가 제 시간에 응답하지 못했기 때문일 수 있습니다.
이 서버에 연결을 시도하는 동안 소요 된 시간은 다음과 같습니다.-[사전 로그인] 초기화 = 42030; handshake = 0;
.NET 애플리케이션은 다음 코드를 실행하는 작은 테스트 앱입니다.
using (SqlConnection conn = new SqlConnection(cs))
using (SqlCommand cmd = new SqlCommand("SELECT COUNT(*) FROM TheTable", conn))
{
conn.Open();
int rowCount = (int)cmd.ExecuteScalar();
}
탁자 은 작고 78 행입니다.
그러나 동일한 시스템에서 .NET 응용 프로그램이이 오류를 수신 에서 SSMS 및 연결 문자열에 명명 된 사용자 ID / 암호를 사용하여 THESERVER에 연결할 수 있습니다.
ADO.Net 앱에서 연결이 실패하지만 SSMS의 동일한 자격 증명으로 성공하는 이유는 무엇입니까?
답변
TCP / IP는 IPv4 주소에 대해 활성화되었지만 IPv6 주소에는 활성화되지 않았습니다 THESERVER
.
분명히 일부 연결 시도는 IPv4를 사용하고 다른 시도는 IPv6를 사용했습니다.
두 IP 버전 모두에 대해 TCP / IP를 활성화하면 문제가 해결되었습니다.
SSMS가 작동했다는 사실은 우연의 일치로 판명되었습니다 (처음 몇 번의 시도는 아마도 IPv4를 사용했을 것입니다). 나중에 SSMS를 통해 연결을 시도하면 동일한 오류 메시지가 나타납니다.
추가 IP 주소에 대해 TCP / IP를 활성화하려면 :
- SQL Server 구성 관리자 시작
- 노드 SQL Server 네트워크 구성을 엽니 다.
- MYSQLINSTANCE에 대한 왼쪽 클릭 프로토콜
- 오른쪽 창에서 TCP / IP를 마우스 오른쪽 단추로 클릭합니다.
- 속성을 클릭하십시오.
- IP 주소 탭을 선택합니다.
- 나열된 각 IP 주소에 대해 활성 및 사용이 모두 예인지 확인합니다.
답변
Ive는 최신 Microsoft 업데이트 (2016 년 9 월 2 일)와 의심스럽게 일치하는 동일한 오류가 발생했습니다. 내 ASP.NET 응용 프로그램이 “사전 로그인 핸드 셰이크 승인을 사용하는 동안 시간 초과 기간이 경과했습니다”오류를 반환하는 동안 SSMS가 문제없이 연결되었음을 발견했습니다.
나를위한 해결책은 연결 문자열에 30 초의 연결 시간 제한을 추가하는 것이 었습니다. 예 :
ConnectionString="Data Source=xyz;Initial Catalog=xyz;Integrated Security=True;Connection Timeout=30;"
내 상황에서 유일한 영향을받는 연결은 통합 보안을 사용하는 연결이었고 연결하기 전에 사용자를 가장하고 있었지만 SQL 인증을 사용하여 동일한 서버에 대한 다른 연결이 제대로 작동했습니다!
2 개의 테스트 시스템 (별도의 클라이언트 및 SQL 서버)이 동시에 영향을 받아 Microsoft 업데이트가 의심됩니다!
답변
Eric과 같은 문제를 해결했지만 다른 변경 사항이 있습니다.
- SQL Server 구성 관리자 시작
- 노드 SQL Server 네트워크 구성을 엽니 다.
- MYSQLINSTANCE에 대한 왼쪽 클릭 프로토콜
- 오른쪽 창에서 TCP / IP를 마우스 오른쪽 단추로 클릭합니다.
- 속성을 클릭하십시오.
- IP 주소 탭을 선택합니다.
- 나열된 각 IP 주소에 대해 활성 및 사용이 모두 예인지 확인합니다.
과
- 나열된 각 IP 주소에 대해 TCP 동적 포트가 비어 있고 TCP 포트 = 1433 (또는 다른 포트)인지 확인합니다.
- Windows 방화벽을 열고 포트가 들어오는 연결에서 열려 있는지 확인하십시오.
답변
엔터티 데이터 모델을 설정하는 동안 Visual Studio에서 VPN을 통해 로컬 네트워크의 서버에 연결하려고 할 때 동일한 문제가 발생했습니다. 연결 문자열
을 설정하여 해결하도록 관리되었습니다 TransparentNetworkIPResolution=false
. VS 연결 추가 마법사의 고급 탭에서 찾을 수 있습니다.
답변
호스팅 서버에 연결할 때 동일한 핸드 셰이크 문제가 발생했습니다.
네트워크 및 공유 센터를 열고 무선 네트워크 연결에서 IPv6를 활성화했습니다.
답변
.NET Framework 3.5를 사용하여 빌드 된 실행 파일은 최근 일부 Windows 업데이트가 설치된 후 (2017 년 8 월 7 일 주) 약 절반 만에 이러한 연결 문제를보고하기 시작했습니다.
연결 실패는 대상 컴퓨터에 설치된 .NET Framework 4.7로 인해 발생했습니다 (Windows 업데이트 자동 설치가 켜져 있음) -https : //support.microsoft.com/ ? kbid=3186539
.NET Framework 4.7을 제거하면 연결 문제가 해결되었습니다.
분명히 .Net Framework 4.6.1에는 주요 변경 사항이 있습니다.- TransparentNetworkIPResolution
문서에 따라 연결 문자열을 업데이트하면 프레임 워크 버전을 롤백 할 필요없이 문제가 해결되었습니다.
답변
IPv6을 활성화하고 인바운드 포트 1433을 차단 해제하여 Windows Server 2012 및 SQL Server 2012에서이 오류를 수정했습니다.