2012-02-24 29 views
3

如何緩存asmx/js永久呼叫?我嘗試了HTTPModule並實現了緩存。但是,此緩存值在下次登錄時即將過期。它被重置爲最後一次修改日期的一年。通過代碼我不這樣做。在asmx中是否有任何默認設置?如果是這樣,有沒有辦法覆蓋設置?緩存asmx/js不會持續

我用下面的代碼來實現這一點。實際上,我的要求是將這個調用(GetMygrid.asmx/js)緩存在瀏覽器緩存中幾天,並避免304響應。我可以使用HTTPModule緩存這個調用。

private void EndRequest(object sender, EventArgs e) 
{ 
    HttpApplication application = (HttpApplication)sender; 
    HttpContext context = application.Context;   

    var path = context.Request.Path.ToLower().Replace('\\', '/'); 

    if (path.EndsWith("/js") || path.EndsWith("/jsdebug")) 
    { 
     var lastModified = DateTime.UtcNow; 
     var expires = lastModified + TimeSpan.FromDays(5); 

     context.Response.Cache.SetLastModified(lastModified); 
     context.Response.Cache.SetExpires(expires); 
     context.Response.Cache.SetCacheability(HttpCacheability.Public); 

    } 
} 

此代碼在運行時正常工作,而我多次訪問特定頁面。 (GetMygrid.asmx/js)在訪問頁面並獲取以下緩存標題時,我沒有收到304響應。

的Cache-Control:公共

截止日期:星期一,2012年2月27日4時52分11秒GMT

的Last-Modified:星期三,2012 02月22日4時52分11秒GMT

服務器:Microsoft-IIS/7.5

但我的問題是,當我在app(關閉瀏覽器,然後登錄)登錄接下來的時間,這個緩存過期的d值改變回去一年。我正在使用GET方法進行此調用。

緩存控制:私人

內容類型:應用程序/ x-的JavaScript;字符集= UTF-8

內容編碼:gzip

到期日:星期一,2011年2月21日15點35分48秒GMT

上次修改:星期三,2012 02月22日4時39分37秒GMT

在登錄期間,應用程序中沒有任何代碼可以重置緩存。

不理解爲什麼會發生。

有人能幫我嗎?

+0

如果您將InlineScript =「True」添加到頁面上的服務參考,腳本將作爲內聯腳本。這減少了往返。但是,這意味着它們不會被包含在緩存中(如果您的緩存成功了,我還沒有成功)。 – 2017-03-03 20:43:36

回答

1

我有同樣的問題,因爲你,我想出了一個理論;)

從我可以告訴,當JS是「第一」的要求(在會話中儘管可能應用壽命)腳本模塊在內容片上設置'Expire'標題。你可能沒有注意到,你在第一種情況下默默地忽略了對'SetExpires'的調用...該方法的內部[我可能會添加未記錄的]只允許您設置expires標頭If and Only如果新的失效日期早於目前設定的失效日期...因爲'現在+5天'並不早於一年前,所以它實際上並沒有設定!

所有其他的呼叫(我認爲)在第一個呼叫之後都可以接通,因爲無論哪個模塊提供這些腳本代理,都不會在304s上再次設置過期,因此您對SetExpires的呼叫被認爲是「好」。

什麼我不明白是什麼原因導致這種第一」的.asmx/JS的呼籲重新制作時,瀏覽器仍然應該有一個未來的到期本地緩存副本給它:(

煩人HttpCachePOlicy類是密封的,所以我一直無法解決它:(:(先把你的模塊不會工作,因爲SetExpires會成功爲您的腳本模塊uf調用)

我應該補充說,這種行爲使'意義',因爲這意味着腳本代理將永不過時,因爲他們將永遠被重新請求...不幸的是,對我們來說,304s變得相當昂貴,我ca n生活在它過時的狀態,所以想要對此行爲進行一些控制...;)