브라우저에서 사용자 정의 전달 된 이미지 캐싱이없는 이유는 무엇입니까?
-
12-09-2019 - |
문제
이미지를 브라우저에 반환하는 사용자 정의 핸들러가 있습니다.
이미지는 데이터베이스에서 가져옵니다.
어떤 이유로 든 이미지는 브라우저에 의해 캐시되지 않으며, 누군가 아래 코드에서 내가 놓친 것을 발견 할 수 있는지 궁금합니다.
HttpContext.Current.Response.BinaryWrite(imageBytes);
HttpContext.Current.Response.Cache.SetCacheability(HttpCacheability.Public);
Context.Current.Response.Cache.SetAllowResponseInBrowserHistory(true);
if(imgRepGetCache.DateCached.HasValue)
HttpContext.Current.Response.Cache.SetLastModified(imgRepGetCache.DateCached.Value);
HttpContext.Current.Response.Cache.SetExpires(DateTime.Now.AddDays(2));
HttpContext.Current.Response.ContentType = "image/jpeg";
또는 어떻게 지점을 완전히 누락하고 다른 곳에 있어야한다면 다른 곳이 있습니다.
편집하다: 추가 정보 요청에 따라 :
- URL은 항상 동일합니다
- 동일한 PC의 동일한 브라우저에서 표준 IIS 파이프와 파이프를 통해 동일한 파일을로드하는 것을 테스트하고 있습니다. II를 통해로드하는 것은 일반적으로 캐시이며 내 파일은 그렇지 않습니다.
편집 2 : 일반 IIS 경로에서 HTTP 요청/응답을 검사 한 후 ETAG와 관련이 있다고 생각합니다. ETAG (지금은 처음부터 처음)은 문서의 일종의 체크섬 인 것 같습니다. 브라우저의 후속 요청에서 ETAG가 전송되고 서버가 ETAG가 변경되지 않은 경우 304를 수정하지 않음을 반환합니다. 문제 없다! 그러나 나는 이제 다음을 사용하여 ETAG를 설정하고 있습니다.
HttpContext.Current.Response.Cache.SetETag(imgRepGetCache.DateCached.ToString());
그러나 응답에는 나타나지 않습니다. 더 가까이 ...
편집 3 : Firebug를 활용 한 후 HTTP를 검사하는 재미를 검사 한 후 결국 고정했습니다. 아래에 솔루션을 게시했습니다.
해결책
좋아, 나는 그것을 고쳤다.
다음은 다른 사람과 내 미래의 참조를 위해 한 일입니다.
// Check for repeated request for the same image from a browser
if (HttpContext.Current.Request.Headers.Get("If-None-Match") == imgRepGetCache.DateCached.Value.ToString())
{
// Return 304 - Not Modified
HttpContext.Current.Response.Status = "304 Not Modified";
}
else
{
if (imgRepGetCache.DateCached.HasValue)
HttpContext.Current.Response.Headers.Set("Etag", imgRepGetCache.DateCached.Value.ToString());
// ... do my other stuff here
}
매력적으로 작동합니다!
여기에서 잠재적 인 문제가있는 사람이라면이 문제를 업데이트 할 수 있도록 알려주십시오.
명백한 것을 선점하기 위해 - 이미지가 새 시나리오에서 새로운 지 아닌지를 식별하기 위해 날짜 문자열에 100% 의존 할 수 있습니다 (특정 시나리오에서).
다른 팁
당신은 그것에 대해 당신의 게시물에 아무 말도하지 않지만, 이것은 https : // 주소입니까? 브라우저는 보안상의 이유로 인해 HTTPS 사이트의 이미지와 페이지를 캐시하지 않습니다.
응답 생성에서 걱정해야 할 사항은 다음과 같습니다.
- 에타그
- 만료
요청을받을 때 걱정해야 할 사항은 다음과 같습니다.
- 마지막으로 수정되었습니다
- 일치한다
- 일치하지 않는 경우
- 수정 된 경우
- if-unmodified-since
- 수정되지 않는 한
다음 HTTP 방법에 대해 걱정해야 할 수도 있습니다.
- 가져 오기
- 머리
다음은 귀하의 요구에 맞게 리팩터를 쉽게 리팩터링 해야하는 솔루션입니다.http://code.google.com/p/talifun-web/wiki/staticfilehandler
파일 시스템에서 파일을 읽고 메모리의 캐시에 배치하므로 데이터베이스에서 읽으십시오. 쉬운 일이어야합니다.