2012-01-03 68 views
8

我正在嘗試使用ASP MVC 3網站獲得HTML 5脫機應用程序緩存。我得到的問題是當我嘗試在離線模式下導航到頁面時, ,它不起作用。HTML 5緩存清單應該如何處理Ajax請求?

我正在使用清單文件的動作,以便它可以動態生成,並在視圖中指定 Resonse.ContentType =「text/cache-manifest」。

我在IIS本地託管應用程序,所以我使用http://192.168.55.127/mywebsite/來訪問它。

這是我正在使用的清單視圖。它使用剃刀視圖引擎,有點混亂(硬編碼URL等) ,而我試圖找出什麼是錯的。

@{ 
    Layout = null; 
    Response.ContentType = "text/cache-manifest"; 
} 
CACHE MANIFEST 

# Version: @ViewBag.Version 

CACHE: 
#Script Files 
@foreach(var jsFile in Url.GetJsFiles()) 
{ 
    @string.Format("{0}{1}\r\n", "http://192.168.55.127", Url.Content(jsFile)) 
} 

#Style Sheets 
@foreach(var cssFile in Url.GetCssFiles()) 
{ 
    @string.Format("{0}{1}\r\n", "http://192.168.55.127", Url.Content(cssFile)) 
} 

#Images 
@foreach(var imageFile in Url.GetImageFiles()) 
{ 
    @string.Format("{0}{1}\r\n", "http://192.168.55.127", Url.Content(imageFile)) 
} 

#HTML Pages 
@string.Format("{0}{1}", "http://192.168.55.127", Url.Content("~/pages/master.htm")) 
@string.Format("{0}{1}", "http://192.168.55.127", Url.Content("~/pages/home.htm")) 
@string.Format("{0}{1}", "http://192.168.55.127", Url.Content("~/pages/options.htm")) 

NETWORK: 
* 

這導致諸如路徑:

http://192.168.55.127/mywebsite/scripts/Libs/jQuery.js 
http://192.168.55.127/mywebsite/pages/home.htm 

這似乎是細。

我有參考使用的完整路徑過於清單文件:

<html manifest="http://192.168.55.127/mywebsite/manifest"> 

這似乎是確定,因爲當我加載在Chrome網站並觀察開發者控制檯,它似乎 緩存所有這些文件不會引發任何錯誤。另外,如果我導航到http://192.168.55.127/mywebsite/manifest 它提供清單,因爲我期望看到它。

該網站不使用正常的導航,而是使用散列片段進行導航 - 因此導航到家庭的網址將是master.htm#home或選項它將是master.html#選項。這個哈希更改是由javascript拾取的,它使用ajax將頁面加載到主容器中,更具體地說,它使用jQuery中的'load'方法來執行此操作。

當不在離線模式下時,這一切都可以正常工作,並且在導航時觀察瀏覽器中的網絡選項卡時,請求URL是正確的,並且與清單文件中列出的URL相同。我唯一能想到的就是離線模式不適用於ajax請求,但我的印象是它的工作原理是一樣的。

我通過清除所有歷史記錄,瀏覽到網站主頁,啓用離線模式,然後嘗試導航到選項頁面,使用FireFox(版本9.0)測試離線模式。在firebug中,我看到一個正確的選項頁面URL的GET請求,但它永遠不會返回,甚至沒有錯誤。裝載輪(在螢火蟲的淨選項卡旁邊的請求旁邊)只是繼續轉動,就好像它仍在加載。我也在Opera 11.60上試了一下(因爲它也有一個離線模式),同樣的事情發生。

任何人有什麼想法,我做錯了什麼?我錯過了一些顯而易見的或誤解了清單應該如何工作的東西嗎?任何建議將不勝感激。

回答

1

(我知道這個問題的舊的,但以供將來參考...)

如果AJAX內容文件的應用程序緩存清單文件中列出正確(他們似乎),那麼這應該工作。就我個人而言,我會使用相對而不是絕對路徑,但這不應該有所作爲。

你的問題似乎是清單文件沒有文件擴展名。嘗試將文件(及其在master.htm中的引用)重命名爲appcache.manifest或類似文件。然後您需要確保清單文件的MIME類型在服務器中設置。例如。對於Apache,你可以添加如下內容:

AddType text/cache-manifest .manifest 

到服務器的配置文件或.htaccess文件。

此外,除了在測試時清除緩存的數據,請確保在更改清單文件時刷新頁面至少幾次,因爲瀏覽器會檢查更新並在單獨的頁面加載中下載文件。

最後,如果您使用AJAX插入的文件在網址中包含參數(例如, ?id = 1234,但沒有在清單文件中列出。這似乎並不是這種情況,但應該注意。