2012-10-25 4 views
3

.aspx 페이지를 사용하여 주어진 매개 변수에 따라 파일 시스템에서 이미지 파일을 제공하고 있습니다. Server.Transfer()를 사용할 때 HTTP 헤더가 만들어지지 않는 이유는 무엇입니까?

Server.Transfer(imageFilePath); 

이 코드가 실행

는 이미지가 게재되어 있지만 마지막으로 수정 HTTP 헤더가 생성되지 않습니다. 같은 파일과는 달리, 동일한 서버의 URL에서 직접 호출됩니다.

따라서 브라우저는 If-Modified-Since을 발행하지 않으며 응답을 캐시하지 않습니다.

파일을 직접 요청 (이 경우 이미지)하는 것처럼 서버에서 HTTP 헤더를 만들 수 있습니까? 아니면 수동으로 헤더를 만들어야합니까?

+0

가능한 복제본 [Server.Transfer Asp.Net?](http://stackoverflow.com/questions/11417355/how-to-set-response-header-before-server)에서 응답 헤더를 설정하는 방법 - transfer-in-asp-net) –

+1

@Cthulhu 응답 헤더를 설정하는 방법 **을 묻는 중입니다 ** ** 설정해야하는 경우 – Abir

답변

1

@ Guffa의 대답을 확장하고 선택한 해결책을 공유 할 것입니다.

Server.Transfer 메서드를 호출 할 때 .NET 엔진은이를 .aspx 페이지와 같이 처리하므로 정적 파일을 처리 할 때 필요한 적절한 HTTP 헤더 (예 : 캐싱)를 추가하지 않습니다.

Response.Redirect를 사용하여 세 가지 옵션

  • 있다, 그래서 브라우저는
  • 헤더가 필요한 설정 및 내용
  • 필요한 헤더를 설정하고 Server.Transfer
  • 를 호출을 제공하기 위해 Request.BinaryWrite를 사용하여 해당 요청을

제 3의 옵션을 선택합니다. 내 코드는 다음과 같습니다.

 try 
     { 
      DateTime fileLastModified = File.GetLastWriteTimeUtc(MapPath(fileVirtualPath)); 
      fileLastModified = new DateTime(fileLastModified.Year, fileLastModified.Month, fileLastModified.Day, fileLastModified.Hour, fileLastModified.Minute, fileLastModified.Second); 
      if (Request.Headers["If-Modified-Since"] != null) 
      { 
       DateTime modifiedSince = DateTime.Parse(Request.Headers["If-Modified-Since"]); 

       if (modifiedSince.ToUniversalTime() >= fileLastModified) 
       { 
        Response.StatusCode = 304; 
        Response.StatusDescription = "Not Modified"; 
        return; 
       } 
      } 
      Response.AddHeader("Last-Modified", fileLastModified.ToString("R")); 
     } 
     catch 
     { 
      Response.StatusCode = 404; 
      Response.StatusDescription = "Not found"; 
      return; 
     } 
     Server.Transfer(fileVirtualPath); 
1

파일로 전송하면 기본적으로 .NET 엔진에서 실행되므로 서버는 .aspx 파일과 동일한 헤더를 반환합니다. 브라우저가 요청을 수 있도록

  • 가 대신 파일로 리디렉션합니다

    당신은 기본적으로 두 가지 옵션이 있습니다.

  • 원하는 헤더를 설정하고 Request.BinaryWrite (또는 익숙하지 않은)을 사용하여 응답에서 파일 데이터를 다시 보냅니다.

+0

내가 아직 누락 된 것은 .NET 엔진은 기본적으로 내 헤더 파일과 동일한 헤더를 반환하지 않습니다. – Abir

+1

@Abir : 전송을하면 정적 파일이 아닌 페이지로 처리하고 페이지를 캐싱하지 않으려면 브라우저가 캐싱하지 못하도록하는 헤더를 반환합니다. – Guffa

+0

감사합니다. 내 대답과 내 답변을 결합했습니다. – Abir