Html 5 манифест не работает iFrame правильно - программирование
Подтвердить что ты не робот

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.

4b9b3361

Ответ 1

Я попробовал ваш образец проекта. Мне пришлось изменить атрибут sandbox на allow-scripts, потому что иначе Chrome блокировал выполнение JS из iFrame.

Кроме того, я думаю, что ваш кеш работает нормально. См. Снимок экрана ниже. enter image description here

Я думаю, что основной причиной вашего замешательства является то, что вы проверяете статус основного документа appCache, у которого нет манифеста. Манифест для документа, загруженного в iFrame. Итак, в Chrome, если вы переключаетесь на индивидуальный iFrame и проверяете статус, он показывает Idle (1), что означает, что кеш активен! См. Ниже:

enter image description here

Надеюсь, это поможет!