Yas*_*adi 10 c# iframe html5 cache-manifest
我有一个有几个C#项目的应用程序,如下所示
每个Web项目(如CRM.Web)都有自己的"html视图"和"js控制器",还有其他几种类型的静态文件.
为了使部署更容易,我想使用Html5清单.
因此,为了实现跨项目的分离部署,我使用了iframe.因此,随着CRM.Web的变化,客户将获得CRM文件,而无需再次下载Warehouse.Web文件!
脚步:
1-我有一个Web API方法,它返回Web程序集的所有名称,例如CRM.Web和Warehouse.Web
2-我还有另一种Web API方法,它将程序集名称作为参数获取,并返回清单文件内容,该内容指向位于该项目上的文件.
public HttpResponseMessage GetManifestByAssemblyName(String assemblyName)
Run Code Online (Sandbox Code Playgroud)
这里省略代码.
response.Content = new StringContent(manifestBody.ToString(), Encoding.UTF8, "text/cache-manifest");
Run Code Online (Sandbox Code Playgroud)
3-在客户端我为每个程序集创建一个新的iFrame,并将src设置为另一个web api方法,该方法返回html主体,它的清单被分配给返回清单体的WebAPI方法的地址(GetManifestByAssemblyName)
String result = String.Format
(@"<html manifest='{0}'> </html>", "/api/AppManifest/GetManifestByAssemblyName?assemblyName=" + assemblyName + ".manifest");
response.Content = new StringContent(result, UTF8Encoding.Default, "text/html");
Run Code Online (Sandbox Code Playgroud)
iFrames的代码:
var htmlPageUrl = "/api/AppManifest/GetHtmlContainerForManifestByName?assemblyName=" + name;
var iFrame = document.createElement("iFrame");
iFrame.setAttribute("src", htmlPageUrl);
iFrame.setAttribute("sandbox", "allow-same-origin");
iFrame.setAttribute("seamless", "seamless");
document.body.appendChild(iFrame);
Run Code Online (Sandbox Code Playgroud)
当我运行应用程序时,它获取程序集名称,然后创建iFrame,每个iFrame自动获得自己的清单.
但window.applicatioCache.status为0表示它没有缓存.
当我进入资源页面时,我可以看到以下内容:

但是,当我请求其中一个缓存的文件时,请求将不使用缓存.
我知道我的网络工作没有参考,这完全基于我的想法,我知道这里可能会出现一些安全限制,但有没有解决问题的方法?
提前致谢.
然后按Ctrl + S保存文件,并首先阅读Index.html说明.
我尝试了你的示例项目。我必须将sandbox属性更改为allow-scripts,因为否则 Chrome 会阻止 iFrame 的 JS 执行。
除此之外,我认为你的缓存工作正常。请参阅下面的屏幕截图。

我认为您感到困惑的根本原因是您正在检查主文档的 appCache 状态,该状态没有清单。该清单适用于 iFrame 中加载的文档。因此,在 Chrome 中,如果您切换到单个 iFrame 并检查状态,它会显示Idle (1)这意味着缓存处于活动状态!见下文:

希望这可以帮助!