Html 5 манифест не работает iFrame правильно
У меня есть приложение, которое имеет несколько проектов на С#, как показано ниже
- CRM.DomainLogic
- CRM.Web
- Warehouse.DomainLogic
- Warehouse.Web
- ...
Каждый проект web, такой как CRM.Web, имеет свои собственные "html views" и "js-контроллеры",
и есть несколько других типов статических файлов.
Чтобы упростить развертывание, я хотел бы использовать манифест Html5.
Итак, чтобы сделать раздельное развертывание по возможным проектам, я использовал iframes.
В результате с изменениями CRM.Web клиенты получат CRM файлы, и нет необходимости снова загружать файлы Warehouse.Web!
Шаги:
1- У меня есть метод Web API, который возвращает все имена веб-сборок, например 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("sandbox", "allow-same-origin");
iFrame.setAttribute("seamless", "seamless");
document.body.appendChild(iFrame);
Когда я запускаю приложение, он получает имена сборки, а затем создает iFrames, и каждый iFrame автоматически получает свой манифест.
Но window.applicatioCache.status равно 0, что означает отсутствие кеша.
Когда я перехожу на страницу ресурсов, я вижу следующее:
![enter image description here]()
Но когда я запрашиваю один из тех файлов, которые кэшируются, запрос не будет использовать кеш.
Я знаю, что нет ссылок на мою работу в Интернете, и это полностью основано на моих идеях, и я знаю, что некоторые ограничения безопасности могут появляться здесь, но есть ли какие-либо решения для решения проблемы?
Спасибо заранее.
Примечание: Здесь можно скачать примерный исходный код приложения.
Затем нажмите Ctrl + S, чтобы сохранить файл, и сначала прочитайте заметки Index.html.
Ответы
Ответ 1
Я попробовал ваш образец проекта. Мне пришлось изменить атрибут sandbox
на allow-scripts
, потому что иначе Chrome блокировал выполнение JS из iFrame.
Кроме того, я думаю, что ваш кеш работает нормально. См. Снимок экрана ниже.
![enter image description here]()
Я думаю, что основной причиной вашего замешательства является то, что вы проверяете статус основного документа appCache, у которого нет манифеста. Манифест для документа, загруженного в iFrame. Итак, в Chrome, если вы переключаетесь на индивидуальный iFrame и проверяете статус, он показывает Idle (1)
, что означает, что кеш активен! См. Ниже:
![enter image description here]()
Надеюсь, это поможет!