2016-11-25 5 views
4

저는 수년간 생산되어 왔으며 수십 가지의 업데이트가있는 ASP.NET 웹 API를 호스팅하고 있습니다. 갑작스런 코드 변경이 있은 후 갑자기 어떤 브라우저 또는 클라이언트가 사용되던간에 정확히 50 요청 후에 API가 충돌합니다. 웹 서버를 즉시 다시 시작하면 API 가용성이 복원되지만 응용 프로그램 풀 재활용은 새로 시작됩니다.정확히 50 건의 요청 후 ASP.NET 웹 사이트가 다운 됨

이 이상한 효과는 여러 컴퓨터 (Windows Server 2008, Windows Server 2013 및 Windows 7)에서 지속됩니다. 서로 다른 웹 서버 (IIS 7.5, IIS 8.5, UltiDev Web Server)에 설치됩니다. IDE는 Visual Studio Community 2015입니다. .NET 버전은 4.5.2입니다.

외부 API 의존성을 추가하지 않았습니다. 나는 Firebird (유일한 외부 의존성)가 "50"이라는 한계를 부과하는 것을 의심하고 있지만, 모든 실험과 인터넷 검색은 아무 소용이 없다.

내가 추출 할 수있는 유용한 로그 메시지는 때문에 DB 연결에 실패했습니다. (Firebird 2.5 SuperServer x64와 Firebird .NET Provider를 FirebirdSql.Data.FirebirdClient.dll 3.0.2 버전으로 사용하고 있습니다. 아직까지는 DB에 연결하여 검색 할 수 있습니다. 그것 FlameRobin 통해. 어쨌든 이전 API 버전으로 돌아 가면 모든 것이 잘 작동합니다.

AB--CD (Server) Fri Nov 25 14:22:57 2016 
    INET/inet_error: read errno = 10054 

이미 문제가 독립적 인 로컬 데이터베이스와 다른 시스템에서 계속 언급 :

는 충돌 후, 이전에 firebird.log이 같은 50 동일한 메시지에 포함 된 삭제. DB 백업/복원은 Firebird 서비스를 다시 시작하는 것처럼 쓸모가 없습니다. 웹 서버를 다시 시작하면됩니다. 어떤 아이디어에 대한

감사합니다 ...

+12

... 물론,이 문제를 해결했다. 그래도 코드가 없으면 이것은 짐작입니다. – Liam

+0

Liam에 동의합니다. SqlConnections를 닫거나 처리하지 않고 연결 풀이 가득 찬 것처럼 들립니다. – DrMistry

+1

오류 10054는 피어에 의해 재설정 된 (winsock) 연결입니다. 연결 풀 (기본적으로 Firebird ado.net 공급자가 있음)이 있고 풀에 50 개의 연결이 열려 있으면 응용 프로그램의 충돌로 인해 소켓이 갑자기 종료되어 해당 오류가 Firebird 서버에 기록됩니다. Firebird 자체는 연결 제한을 두지 않습니다. Windows의 Firebird SuperServer는 최대 1024 개 (또는 최신 버전에서는 2048 개)로 제한됩니다. 작동하는 버전과 작동하지 않는 버전 사이의 변경 사항을 면밀히 검토하는 것이 좋습니다. –

답변

3

감사합니다, 리암/DrMistry/마크, 그것이 무엇

. 신비한 "50"은 연결 문자열의 최대 풀 크기입니다. 며칠 동안 내가 쫓고 있었던 버그는 내가 본 것 중 가장 단순한 것 중 하나입니다 - DB 연결이 수행되는 라인은 이 중복 된입니다. 이처럼 :에만 두 번째 연결이 닫혀있어

db.Connect(); 
db.Connect(); 

때문에, 모든 요청은 하나 개의 저승으로 연결, 결과적으로 연결 풀 신속 붐볐다를 보냈다. 이것은 당신이 금요일 밤에 석방 될 가능성이 있다면 일어납니다! 두 개의 동일한 라인 중 하나를 삭제

내가 당신의 당신의 연결을 폐기하지 상상 것하고 연결 풀을 긁고있다