2010-05-22 2 views
3

여러 개의 쿼리 문자열 변수를 사용하여 이미지를 제공하는 스크립트가 있습니다. 또한 IIS 7.5에서 URL 재 작성을 사용하고 있습니다. http://mydomain/Picture.aspx?group=ajfhajkfhal&id=44&thumb=thumb.jpg 또는 http://mydomain/Picture.aspx?group=ajfhajkfhal&id=44스크립트를 통해 제공되는 이미지 캐시

가 나는 그들이 때 캐시 JPG 이미지에 IIS 캐싱 규칙을 추가 : http://mydomain/pictures/ajfhajkfhal/44/thumb.jpg 또는 http://mydomain/pictures/ajfhajkfhal/44.jpg

이 가 다시 작성 :

그래서 이미지는이 같은 URL이 요청했다. 이것은 디스크의 실제 이미지 인 내 이미지와 함께 작동합니다. 이미지가 스크립트를 통해 제공되면 캐시되지 않고 항상 스크립트를 통해 이미지가 요청됩니다.

이미지가 자주 변경되지 않으므로 캐시를 적어도 30 분 (또는 파일 변경까지) 보관하는 것이 가장 좋습니다.

내 웹 사이트에 .NET/C# 4.0을 사용하고 있습니다. 나는 C#에서 몇 가지 캐시 옵션을 설정하려했지만 내 정적 이미지가 제대로 캐시되는 동안 이러한 이미지 (클라이언트 측)를 캐싱하는 방법을 찾지 못하는 것 같습니다.

EDIT 다음 옵션을 사용하여 클라이언트 측에서 이미지를 캐시합니다. 여기서 'fileName'은 디스크의 이미지 파일 이름입니다.), 즉를 지적

context.Response.AddFileDependency(fileName); 
context.Response.Cache.SetETagFromFileDependencies(); 
context.Response.Cache.SetLastModifiedFromFileDependencies(); 
context.Response.Cache.SetCacheability(HttpCacheability.Public); 
context.Response.Cache.SetExpires(DateTime.Now.AddTicks(600)); 
context.Response.Cache.SetMaxAge(new TimeSpan(0, 5, 0)); 
context.Response.Cache.SetSlidingExpiration(true); 
context.Response.Cache.SetValidUntilExpires(true); 
context.Response.ContentType = "image/jpg"; 

편집 2 덕분에, 그것은 참으로 아주 어리석은 실수였다. 지금부터 30 분으로 변경했습니다 (DateTime.Now.AddMinutes (30)).

하지만 문제가 해결되지 않습니다. Firefox에 문제가 있다고 생각합니다. Firebug를 사용하여 각 요청을 추적하고 어떻게 든 근본적으로 잘못된 일을하고 있다고 생각합니다. 내 페이지가 항상 "200 (OK)"을 반환하는 동안 일반 이미지 (캐시되고 정적 인)는 응답 코드 "304 (Not Modified)"를 돌려줍니다. 당신이 "스크립트"을 의미하는 것은 당신의 Picture.aspx의 코드 인 경우

alt text http://images.depl0y.com/capture.jpg

답변

1

, 전 C#이 스크립트 언어 아니라고 지적한다, 그래서 기술적으로 스크립트 아니다.

ASP.NET에서 제공하는 캐싱 API를 사용할 수 있습니다.
나는 이런 식으로 뭔가를 포함하는 방법을 가지고 있다고 생각합니다. 당신이 캐시에 사용하는 키는 각 캐시 아이템에 고유해야

string fileName = ... // The name of your file 
byte[] bytes = null; 

if (HttpContext.Current.Cache[fileName] != null) 
{ 
    bytes = (byte[])HttpContext.Current.Cache[fileName]; 
} 
else 
{ 
    bytes = ... // Retrieve your image's bytes 
    HttpContext.Current.Cache[fileName] = bytes; // Set the cache 
} 

// Send it to the client 
Response.BinaryWrite(bytes); 
Response.Flush(); 

주, 그래서 그냥이에 대한 파일의 이름을 사용하기에 충분하지 않을 수도 있습니다 : 다음은 캐시 API를 사용할 수있는 방법입니다 목적.

편집 :

클라이언트 측의 컨텐츠 캐싱을 사용하려면, 다음을 사용 :

Response.Cache.SetCacheability(HttpCacheability.Public); 

당신은 다른 HttpCacheability 값을 실험 할 수 있습니다. 이를 통해 컨텐츠를 캐시하는 방법과 위치를 지정할 수 있습니다. (예 :서버, 프록시 및 클라이언트)

이렇게하면 ASP.NET에서 클라이언트가 적절한 HTTP 헤더를 사용하여 캐싱 규칙을 보낼 수 있습니다.
이렇게해도 클라이언트가 실제로 캐시 할 수있는 것은 아니지만 (예 : 브라우저 설정에 따라 다름) 브라우저에서 "캐시해야합니다!"라고 알려줍니다.

클라이언트와 서버 측 모두에서 캐싱을 사용하는 것이 가장 좋습니다.

편집 2 :

코드의 문제는 SetExpires(DateTime.Now.AddTicks(600))입니다. 600 틱은 단지 몇 초입니다 ... (1 초 = 10000000 틱)
기본적으로 콘텐츠는 캐시되지만 브라우저에 도착하면 만료됩니다. 내 생각

+0

흠, 파일이 다음 캐시 서버 측을

context.Response.Cache.SetExpires(DateTime.Now.AddMinutes(5)); context.Response.Cache.SetMaxAge(TimeSpan.FromMinutes(5)); 

,하지만 난 이미지가 클라이언트를 캐시 할 사랑합니다 (TimeSpan.FromMinutesnew TimeSpan(...)보다 더 많은 읽을 수도 있습니다.) :

는 이러한 시도 측면 (브라우저에서 활성화 된 경우), 이제는 정적 이미지 만 캐시하는 것처럼 보입니다. –

+0

@Wim - 일부 HTTP 헤더를 지정하여 클라이언트 측 캐싱을 사용할 수 있습니다. 이 작업은 ASP.NET에서 쉽게 수행 할 수 있습니다. 필자는 대답을 편집하여 방법을 보여줍니다. – Venemo

+0

@ 베네모,이게 내가 시도한거야. 하지만 어쨌든 내 파이어 폭스는 기본 캐시 설정을하는 동안 모든 이미지를 다시로드합니다. 내가 볼 때 : 캐시 및 내 이미지가 캐시되어 있는지 확인, 그들은 거기에 있습니다. Firefox는 캐시 된 경우에도 항상 이미지를 다시로드합니다. 클라이언트 쪽을 캐시하는 데 사용하는 옵션을 표시하기 위해 제 질문을 편집했습니다. 나는 이것이 어떻게 든 브라우저 일이라고 생각한다. –

관련 문제