클라이언트 서버 (W2k3, IIS6, .NET 2.0)에서 실행되는 ASP.NET 응용 프로그램이 있습니다. FWIW, 이것은 테스트 인스턴스이며 아직 프로덕션 으로 이동 되지 않았습니다. 따라서 SSL,로드 밸런싱 등에서 실행되지 않습니다.
사무실에서 서버의 페이지 중 하나에 액세스하면 페이지가 한 번 방문합니다. IIS 로그 (c : WINDOWS \ system32 \ LogFiles \ W3SVC1)를 검사하면 해당 페이지에 대한 GET이 표시되고 페이지의 버튼을 누르면 로그 파일에 POST가 표시됩니다. 이것은 지금까지 잘 작동하는 것 같습니다.
이제 클라이언트 네트워크에 원격으로 접속하여 로컬 머신 중 하나에서 페이지에 액세스하면 로그 파일에 GET이 표시되고 페이지의 버튼을 누르면 로그 에 동일한 초에 두 개의 POST가 표시 됩니다. 첫 번째는 상태 (sc-status, sc-substatus, sc-win32-status) 200 0 64를 나타내고 두 번째 것은 200 0 0을 나타냅니다.
로그 파일에서 두 POST는 동일합니다. 기본적으로 로그는 다음과 같습니다 (일부 데이터를 마스킹 한 경우 제외).
# 필드 : 날짜 시간 s-ip cs-method cs-uri-stem cs-uri-query s-port cs-username c-ip cs (User-Agent) sc-status sc-substatus sc-win32-status 2009-08-11 20:19:32 xxxx GET /File.aspx-80-yyyy Mozilla / 4.0 + (호환; + MSIE + 8.0; + Windows + NT + 6.0; + WOW64; + Trident / 4.0; + SLCC1; + .NET + CLR + 2.0.50727; +. NET + CLR + 3.5.21022; +. NET + CLR + 3.5.30729; +. NET + CLR + 3.0.30618; + MDDR; + OfficeLiveConnector.1.4; + OfficeLivePatch .0.0) 20000 2009-08-11 20:19:45 xxxx POST /File.aspx-80-yyyy Mozilla / 4.0 + (호환; + MSIE + 8.0; + Windows + NT + 6.0; + WOW64; + Trident / 4.0; + SLCC1; + .NET + CLR + 2.0.50727; +. NET + CLR + 3.5.21022; +. NET + CLR + 3.5.30729; +. NET + CLR + 3.0.30618; + MDDR; + OfficeLiveConnector.1.4; + OfficeLivePatch .0.0) 200 0 64 2009-08-11 20:19:45 xxxx POST /File.aspx-80-yyyy Mozilla / 4.0 + (호환; + MSIE + 8.0; + Windows + NT + 6.0; + WOW64; + Trident / 4.0; + SLCC1; + .NET + CLR + 2.0.50727; +. NET + CLR + 3.5.21022; +. NET + CLR + 3.5.30729; +. NET + CLR + 3.0.30618; + MDDR; + OfficeLiveConnector.1.4; + OfficeLivePatch .0.0) 20000
문제는 페이지가 두 번 적중하는 것입니다. 데이터베이스는 첫 번째 요청에 대한 작업을 수행 한 다음 두 번째 요청은 중복 작업이 수행되고 있음을 감지하고 오류 메시지를 발생시킵니다. 사용자는 작업이 실패했다고 생각하지만 실제로 성공했습니다.
sc-win32-status 64의 오류 설명은 “지정된 네트워크 이름을 더 이상 사용할 수 없습니다.”입니다. 이것은 두 POST 요청 모두 HTTP 상태가 200으로 표시되어 서버가 요청을 성공적으로 처리했지만 클라이언트에게 알리지 않고 요청을 다시 제출한다는 것을 믿습니다.
-
이 문제를 어떻게 해결할 수 있습니까?
-
내부 네트워크에서만이 동작을 유발할 수있는 아이디어가 있습니까?
-
나는이 두 개의 별도의 클라이언트 사이트에서 무슨 일이 일어나고 언급해야하지만, 않습니다 하지 우리의 다른 클라이언트 사이트의 6시에 발생, 또는 우리의 사무실에서, 또는 웹을 통해 8 개 클라이언트의 연결.
-
이 문제를 로컬 네트워크에서 100 % 재현 할 수 있지만 다른 곳에서는 0 % 재현 할 수있는 것은 무엇입니까?
업데이트 : 매우 작은 수의 복제 된 POST 요청에 원래보고 된대로 64 대신 sc-win32 상태가 995라는 것을 알았습니다. sc-win32-status = 995의 오류 설명은 다음과 같습니다. “스레드 종료 또는 응용 프로그램 요청으로 인해 I / O 작업이 중단되었습니다.” 이것은 말이되지 않습니다 (코드에 대한 모든 액세스 권한이 있다고 간주). 나는 여전히이 문제가 어떻게 또는 왜 발생하는지 이해하지 못하지만 새로운 오류 코드는 결국 네트워크 문제가 아닐 수 있다고 믿게 만들고 무작위 코드 버그의 가능성을 조사하고 있습니다.
답변
이것은 지금까지 문제에 대한 나의 이해입니다.
- sc-win32-status 64는 “지정된 네트워크 이름을 더 이상 사용할 수 없음”을 의미합니다.
- IIS가 최종 응답을 클라이언트에 보낸 후 일반적으로 클라이언트로부터 ACK 메시지를 기다립니다.
- 때때로 클라이언트는 최종 ACK를 서버로 다시 보내는 대신 연결을 재설정합니다. 이것은 적절한 연결이 아니며 IIS는“64”코드를 기록합니다.
- 많은 클라이언트는 연결이 완료되면 TIME_WAIT / CLOSE_WAIT에 그대로 두지 않고 연결을 해제하기 위해 연결을 재설정합니다.
- 프록시는 다른 것보다 더 많이하는 경향이 있습니다.
업데이트 : 여기 와 여기에 흥미로운 정보가 있었으므로 기본적으로 페이지를 다시 작성하여 잘못된 마크 업 등이 없었으며 문제가 해결되었습니다! 그것은 어두운 곳에서 촬영 한 것이며, 특정 상황에서 고객에게만 영향을 미쳤 기 때문에 문제가 해결 된 것이 무엇인지 분명히 말할 수 없었습니다 …
답변
프록시 서버를 통해 IIS6에서 gzipped 바이너리 파일을 제공하려고 할 때도 이와 동일한 문제가 발생했습니다. 웹 사이트를 직접 방문 할 때 아무런 문제가 없었습니다.
클라이언트 컴퓨터 에서 Fiddler 를 실행 하고 응답을 검사하여 이것이 내 원인이라는 것을 알았습니다 . 피들러는 응답이 인코딩되었음을 경고 한 다음 gzip 파일의 마법 번호가 올바르지 않다고 불평합니다.
내 코드에서 이진 파일에 대한 gzip 압축을 해제하고 문제가 발생하지 않았습니다.
답변
나는 이것에 대해 전문가가 아니지만 호스트 이름 대신 IP 주소를 사용할 때만 발생하는 비슷한 문제를 겪었습니다.
어쩌면 조금 도움이 될 것입니다 …
매트.