2012-10-25 31 views
3

我使用.aspx頁面根據給定的參數從文件系統提供圖像文件。爲什麼當我使用Server.Transfer()時HTTP頭文件不會被創建?

Server.Transfer(imageFilePath); 

運行此代碼時,圖像被供應,但沒有上次修改 HTTP頭被創建。 而不是相同的文件,直接從相同服務器上的URL調用。

因此,瀏覽器不會發出If-Modified-Since並且不緩存響應。

有沒有辦法讓服務器像通常那樣通過文件的直接請求來創建HTTP Headers(在這種情況下是圖像)還是必須手動創建頭文件?

+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,所以瀏覽器進行適當的請求
  • 設置頁眉需要使用Request.BinaryWrite服務內容
  • 設置所需的標題和調用Server.Transfer

我選擇第三個選項,這裏是我的代碼:

 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

當您傳輸到文件時,服務器將返回與.aspx文件相同的標題,因爲它基本上由.NET引擎執行。

你基本上有兩種選擇:

  • 做一個重定向,而不是文件,這樣瀏覽器使得它的要求。

  • 設置您想要的標題,然後使用Request.BinaryWrite(或很熟悉)將文件數據發送迴響應中。

+0

我仍然缺少的東西是.NET引擎在我的情況下不會返回相同的頭文件,因爲它基本上應該是這樣。 – Abir

+1

@Abir:如果您進行了傳輸,它將以頁面而不是靜態文件的形式處理它,並返回使瀏覽器無法緩存的頁眉,因爲您不希望頁面被緩存。 – Guffa

+0

謝謝,我已將你的答案與我的結合起來 – Abir

相關問題