C# · 12月 27, 2021

c# – Html 5 manifest不能正常工作iFrame

我有一个应用程序有几个C#项目,如下

> CRM.DomainLogic
> CRM.Web
> Warehouse.DomainLogic
>仓库网
>,…

每个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)

这里省略了代码.

response.Content = new StringContent(manifestBody.ToString(),Encoding.UTF8,”text/cache-manifest”);

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”);

iFrames的代码:

var htmlPageUrl = “/api/AppManifest/GetHtmlContainerForManifestByName?assemblyName=” + name; var iFrame = document.createElement(“iFrame”); iFrame.setAttribute(“src”,htmlPageUrl); iFrame.setAttribute(“sand@R_513_2419@”,”allow-same-origin”); iFrame.setAttribute(“seamless”,”seamless”); document.body.appendChild(iFrame);

当我运行应用程序时,它会获得程序集名称,然后创建iFrames,并且每个iFrame自动获取其自己的清单.

但是window.applicatioCache.status是0,这意味着它没有缓存.

当我去资源页面,我可以看到以下内容:

但是当我请求缓存的那些文件之一时,请求不会使用缓存.

我知道我的工作在网络上没有参考,这完全是基于我的想法,我知道一些安全限制可能会出现在这里,但有什么解决方案来解决问题?

提前致谢.

注意:You can download sample application source code here.

然后按Ctrl S保存文件,首先阅读Index.html注释.

解决方法 我试过你的示例项目.我不得不将sand@R_513_2419@属性更改为allow-scripts,否则Chrome会阻止来自iFrame的JS执行.

除此之外,我认为你的缓存正常工作.见下面的截图.

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

希望这可以帮助!