클래식 ASP - IIS 5에서 IIS 6으로 마이그레이션하면 이미지 캐싱 문제가 발생합니까?

StackOverflow https://stackoverflow.com/questions/304749

  •  08-07-2019
  •  | 
  •  

문제

장황한 질문에 대해 미리 사과드립니다.

저는 실제로 데이터베이스 프로그래머이지만 최근 IIS 5에서 IIS 6을 실행하는 새 서버로 마이그레이션된 클래식 ASP 인트라넷 응용 프로그램에 대한 지원을 물려받았습니다.사용자 기반은 약 12명이며 모두 IE 6을 사용하고 있습니다.

UI는 사용자가 탐색할 때 분기를 숨기거나 확장하기 위해 정렬되지 않은 HTML 목록과 자바스크립트의 조합을 사용하여 데이터베이스에서 반환된 항목의 계층 구조를 표시합니다.

이미지는 각 항목 유형에 대해 서로 다른 이미지를 사용하여 CSS(list-style-image 사용)를 사용하여 목록 구성원 옆에 표시됩니다.계층 구조의 다양한 항목 유형(및 이미지) 수는 2에서 10 사이입니다.계층 구조는 항목 20~200개로 다양합니다.

문제:

IIS 6으로 마이그레이션한 이후 여러 사용자가 계층 구조에 있는 하나 이상의 항목에 이미지가 제대로 적용되지 않아 발생하는 것으로 보이는 문제를 경험했습니다.목록은 올바르게 표시되지만 하나 이상의 이미지가 누락되어 링크를 클릭하면 빈 페이지가 로드됩니다.

Wireshark와 IIS 로그를 사용한 네트워크 트래픽 분석에 따르면 문제는 서버 측에 있는 것이 아닙니다. 모든 콘텐츠가 클라이언트에 올바르게 제공되었습니다.

이 문제는 클라이언트의 콘텐츠 캐싱과 관련된 것으로 보입니다.이전에 현재 PC에서 애플리케이션을 사용하지 않았거나 한동안 사용하지 않은 사용자에게 더 자주 영향을 미치는 것으로 보입니다.또한 세션을 시작하고 브라우저 캐시를 지운 다음 페이지를 새로 고치면 세 번에 한 번 정도 문제를 재현할 수 있습니다.그러나 IIS 5에서 실행되는 응용 프로그램의 경우에도 마찬가지입니다. 따라서 이 문제는 IIS 6으로 마이그레이션하기 전에도 있었을 수 있지만 그 빈도는 더 낮았습니다.가끔 20분 정도 세션을 종료하면 브라우저가 누락된 이미지를 "찾는" 것처럼 보이고 모든 것이 제대로 작동합니다.

응용 프로그램이 로컬 프록시(Fiddler를 사용함)를 통해 액세스되는 경우에는 문제가 발생하지 않습니다. 단, Fiddler 연결 로그에는 이미지를 검색하기 위해 서버에 설정된 하나 이상의 연결이 중단된 것으로 표시됩니다.이전과 마찬가지로 네트워크 트래픽은 이미지가 서버에서 반환되었음을 나타냅니다.그러나 프록시를 사용하면 IE가 캐시에서 성공적으로 검색된 이미지의 다른 복사본을 찾을 수 있게 되는 것 같습니다.

ASP/IIS 문제 디버깅에 대한 지식이 제한되어 있는 지점에 도달했습니다.CSS에서 목록 스타일 이미지를 제거하면 문제가 해결되지만 애플리케이션을 사용하기가 더 어려워지므로 이는 최후의 수단이어야 합니다.

제가 어떻게 진행할 수 있는지에 대한 제안은 감사하게 받아들여질 것입니다.

편집하다

AnonJr는 다른 모든 구성 요소가 올바르게 작동하는 것처럼 보이므로 이는 클라이언트 구성 문제임이 틀림없다고 제안합니다.

간단한 클라이언트 구성 문제를 할인했기 때문에 도구> 인터넷 옵션> 임시 파일> 행동이 변경되지 않은 설정에서 모든 옵션을 테스트 한 문제에 의해 영향을받는 유일한 응용 프로그램이기 때문입니다.

고려해야 할 다른 클라이언트 구성 옵션은 무엇입니까?

편집 2 - 솔루션

수락된 답변을 통해 클라이언트측 스크립트에서 HTML이 생성될 때 이미지의 여러 복사본을 요청하는 IE6의 알려진 문제를 검색하라는 메시지가 표시되었습니다. http://support.microsoft.com/default.aspx?scid=kb;en-us;319546.

기사(이 동작은 "설계상"이라고 명시)에서는 필요한 이미지를 보이지 않는 DIV에 로드하여 사전 캐싱하는 해결 방법을 제안합니다.

<DIV style='display:none'><IMG SRC='image.gif'></DIV>

이것은 나에게 효과가 있는 것 같습니다. 세션 도중에 브라우저 캐시를 지워서 더 이상 문제를 재현할 수 없으며 Fiddler 추적에는 각 이미지가 한 번만 요청된 것으로 표시됩니다.

나는 이전에 알지 못했던 한 가지 주의 사항을 발견했습니다.IE 캐시는 대소문자를 구분하므로 캐시된 이미지는 보이지 않는 DIV에 지정된 파일 이름의 대소문자가 페이지의 다른 곳에서 사용된 것과 일치하는 경우에만 사용됩니다.

도움이 되었습니까?

해결책

이는 브라우저가 동일한 리소스에 대해 여러 요청을 하는 IE6 버그와 비슷합니다.예를 들어 콘텐츠가 목록에서 작은 아이콘을 20번 반복해서 표시하도록 요구하는 경우 해당 이미지를 한 번만 가져오는 대신 20번 가져오려고 시도합니다.응답 중 19개는 304 Not Modified이지만 여전히 서버로의 추가 왕복이 19번입니다.

과거에 이러한 과도한 요청으로 인해 결국 처리되지 않은 요청이 너무 많아지는 것을 발견했습니다.그 시점에서 다른 페이지에 대한 서버에 대한 추가 요청은 적어도 잠시 동안은 응답을 받는 데 어려움을 겪습니다.

귀하의 경우에 이것이 무슨 일이 일어나고 있는지 잘 모르겠습니다. 이를 조사하는 한 가지 방법은 대신 IE7을 사용하여 동일한 문제가 발생하는지 확인하는 것입니다. 이 버그는 IE7에서 수정되었습니다.

편집하다:이제 문제가 제가 언급한 버그인 것으로 확인되었으므로 '짧은 시간 지연'에 대한 KB 참조도 참고해야 합니다.근본적인 문제는 새로 가져온 이미지를 재사용하기 위해 브라우저가 현재 자바스크립트 덩어리가 완료될 때까지 연기되는 작업을 수행해야 한다는 것입니다.'짧은 시간 지연'보다 비동기식 접근 방식이 필요합니다.

저는 이미지를 미리 가져오는 데 display:none DIV 접근 방식을 사용했는데 이는 AJAX 스타일 작업에 적합합니다.그러나 창의 onload 이벤트 도중이나 그 전에 실행 중인 코드가 있는 경우 이 코드에 이미지를 추가할 때 여전히 문제가 발생합니다.onload 이벤트가 완료된 후 실행할 추가 코드를 얻으려면 setTimeout이 필요합니다.

다른 팁

클라이언트 측에서 캐싱 설정을 조정하는 데 주의를 집중할 수 있습니다.서버에서 이미지를 보내는 경우에는 IIS 문제가 아닐 가능성이 높습니다.이미지의 HTML이 브라우저로 전송되는 경우 이는 ASP 문제가 아닙니다.그것은 클라이언트를 떠난다.

프록시는 일부 문제를 완화할 수 있으며/또는 IE6이 이미지 캐시 등을 결정하는 방법에 영향을 미칠 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top