브라우저에서 사용자 정의 전달 된 이미지 캐싱이없는 이유는 무엇입니까?

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

문제

이미지를 브라우저에 반환하는 사용자 정의 핸들러가 있습니다.

이미지는 데이터베이스에서 가져옵니다.

어떤 이유로 든 이미지는 브라우저에 의해 캐시되지 않으며, 누군가 아래 코드에서 내가 놓친 것을 발견 할 수 있는지 궁금합니다.

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

파일 시스템에서 파일을 읽고 메모리의 캐시에 배치하므로 데이터베이스에서 읽으십시오. 쉬운 일이어야합니다.

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