2017-02-17 144 views
1

我的輸出緩存似乎沒有按預期工作 這是一個控制器方法來返回我的網站的默認頁面。 我已經緩存它40秒(測試 - >在現場被緩存更長的時間)OutputCache無法正常工作 - > ASP.NET MVC5

[OutputCache(Duration = 40, Location = OutputCacheLocation.ServerAndClient, VaryByParam = "none")] 
public async Task<ActionResult> Index(){ 
...... 
} 

我有2個問題

首先

當我打的端點第一時間它正確地緩存在服務器上,並返回以下響應頭(如預期)等等。

status:200 
Cache-Control:"private, max-age=40, s-maxage=0" 

當我打開一個新的瀏覽器選項卡並在5秒鐘後粘貼在同一端點。它進入服務器,並返回一個200的內容和以下標題

status:200 
Cache-Control:"private, max-age=63622944145, s-maxage=63622944105" 

這似乎不正確的我。我期望它通過If-modified-since頭向服務器發送請求。如果緩存的響應自頭文件時間以來被重建,那麼它將返回一個200 +內容,否則返回一個304.因此,在這種情況下,由於服務器緩存未被重建,它應該返回一個304.另外,由於最大年齡非常大它現在是無效的,因此立即被視爲陳舊。 那麼我在做什麼錯...?

其次

我把一個斷點在我的索引方式,並從我的瀏覽器擊中了終點。在我第一次點擊Index端點時,斷點被擊中。按照預期,對端點的後續請求不會在接下來的40秒內達到斷點。但是,如果我在瀏覽器中將端點添加到端點的末尾,它將會忽略忽略緩存的斷點。 我該如何避免這種情況..?

+0

關於你的問題,該URL 'http://www.example.com' 和 'http://www.example.com/' 下半年,與/,是不同的頁面。如果您希望兩者的處理方式相同,則您需要在Web.Config中有一個URL重寫模塊。我會在下面修改我的答案。 – kodikas

回答

0

我剛剛有同樣的問題。有在github上一個線程在這裏(我認爲這是一個錯誤): https://github.com/Microsoft/dotnet/issues/330

對我來說,解決辦法如下: (1)下載並安裝.NET 4.6.2開發框架包。轉到項目的「屬性」頁面,從列表中選擇它或轉到安裝其他框架... (2)將您的應用程序定位到4.6.2。您需要重新啓動項目(它有一條消息)。 (3)進入web.config文件,並確保這些值設置:

<system.web> 
<compilation targetFramework="4.6.2" /> 
<httpRuntime targetFramework="4.6.2" /> 

(4)最後,進入到NuGet包安裝程序並安裝下列包(搜索),:微軟AspNet.OutputCache.OutputCacheModuleAsync

問題已解決。我希望這有幫助。

問題2:刪除尾隨斜線

在網頁添加該代碼。配置在適當的部分:

<system.webServer> 
<rewrite> 
    <rules> 
    <rule name="Remove trailing slash" enabled="true" stopProcessing="true"> 
     <match url="(.*)/$" /> 
     <conditions> 
     <add input="{REQUEST_FILENAME}" matchType="IsFile" negate="true" /> 
     <add input="{REQUEST_FILENAME}" matchType="IsDirectory" negate="true" /> 
     </conditions> 
     <action type="Redirect" redirectType="Permanent" url="{R:1}" /> 
    </rule> 
    </rules> 
</rewrite> 
<validation validateIntegratedModeConfiguration="false" />