Разработка
05
Сен
0

Кэширование Веб-ресурсов

Предположим, что у нас имеется Веб-ресурс в виде такой ссылки:

http://crm/Contoso/WebResources/new_/custom_page.htm

Если Вы запросите этот URL в браузере и посмотрите на заголовок ответа (например с помощью DevToolBar’а), то увидите следующее:

Cache-Contro: private
Expires: <Today's Date Time>

Эта инструкция сообщает браузеру/прокси-серверу, что он никогда не должен кэшировать этот файл, и каждый раз, когда браузер запрашивает его, то каждый раз получает его последнюю версию с сервера. А это в свою очередь плохо сказывается на производительности.

Когда на Веб-ресурс ссылается страница CRM 2011, используется следующий формат:

http://crm/Contoso/%7B634411504110000000%7D/WebResources/new_/custom_page.htm

Если Вы посмотрите на заголовки ответа, то увидите такое:

Cache-Control: public
Expires: <Today's Date Time Plus One Year>

Таким образом, браузер/прокси-сервер будет хранить и использовать копию этого Веб-ресурса в течение года.

Дополнительный элемент – %7B634411504110000000%7D – это «папка» кэша и каждый раз, когда кастомизация обновляется (публикуется) это число обновляется. Т.к. кэш браузера/прокси-сервера соединен с URL файла, если URL меняется, кэш больше не является актуальным и его следует обновить путем загрузки последней версии с сервера.

К счастью, в большинстве случаев, CRM 2011 управляет этим за нас, если мы «играем» по его правилам. В CRM имеются следующие возможности показать Веб-ресурс:

  • Встраивание в форму объекта;
  • Ссылка с SiteMap’а;
  • Рисунок на кнопке на Ленте;
  • Всплывающее диалоговое окно, вызываемое по кнопке через JavaScript;
  • Из других Веб-ресурсов.

Поэтому, чтобы гарантировать, что Веб-ресурсы будут кэшироваться в каждом из этих случаев:

  • Встраивание Веб-ресурса в форму объекта

    Если Вы встраиваете Веб-ресурс в форму объекта, каталог кэша используется автоматически. Однако, если этот Веб-ресурс – HTML- страница, убедитесь, что Вы используете относительные пути в любых ссылках javascript/css/img (чтобы «остаться» в каталоге кэша). Например, у Вас есть следующий Вею-ресурсы:

    • new_/Account/AssignAccount.htm
    • new_/scripts/Common.js

    И чтобы сослаться из AssignAccount.htm на скрипт необходимо использовать относительную ссылку:

    <script src="../scripts/Common.js" type="text/javascript"></script>

    А не абсолютную:

    <script src="/Webresources/scripts/Common.js" type="text/javascript"></script>
  • Отображение по ссылке с SiteMap’а

    При показе HTML-страницы по ссылки с SiteMap’а Вы можете гарантировать, что CRM использует каталог кэша, избегая абсолютных путей или используя маркер $webresource в определении SubArea:

    <SubArea
      Id="nav_assignaccount"
      PassParams="0"
      Client="All"
      Url="$webresource:new_/Account/AssignAccount.htm"
      Icon="$webresource:new_/icons/assign16.gif"
    >
    
  • Рисунок кнопки на Ленте

    При ссылке на изображение из SitaMap’а/Ленты используйте маркер $webresource как показано выше, вместо абсолютных путей.

  • Всплывающее диалоговое окно, открывающееся через JavaScript

    Если Вы хотите показать всплывающее окно, которое ссылается на страницу Веб-ресурса. Т.к. в данном случае используется JavaScript, то CRM за Вас не подставит каталог кэша Веб-ресурса и Вы должны создать его самостоятельно.Для этого Вы должны найти текущий каталог кэша из другого Веб-ресурса, который в настоящий момент загружен, используя нечто подобное:

    function GetCacheDirectory(webresourceUrl) {
        var scripts = document.getElementsByTagName("script");
        for (var i = 0; i < scripts.length; i++) {
            var url = scripts[i].src;
            var p1 = url.search("/%7B")
            if (p1 > 0) {
                var p2 = url.search("%7D/", p1) + 4;
                var resourceCache = url.substr(p1, (p2 - p1));
                break;
            }
        }
         var url = "/" + Xrm.Page.context.getOrgUniqueName() + resourceCache + webresourceUrl;
        return url;
    }
    

    И вызвать эту функцию так:

    // Get cache directory resource url
    var url = GetCacheDirectory('/WebResources_/new/Account/AssignAccount.htm');
    // Open Window
    window.open(url)
    
  • Из других Веб-ресурсов

    Eсли Вы ссылаетесь на Веб-ресурсы из других Веб-ресурсов (например, получая XML-конфигурацию для Silverlight-приложения), Вы должны всегда использовать относительные пути (для того чтобы URL содержал «папку» кэширования).

Комментарии (0)

*

code