Загрузка сценариев AjaxControlToolkit из CDN Microsoft с использованием ScriptManager / ToolkitManager - PullRequest
4 голосов
/ 18 февраля 2011

Я знаю, что есть другой вопрос, задающий то же самое, но он уже несколько месяцев не привлекает к себе внимания: https://stackoverflow.com/questions/3786088/how-to-force-ajax-control-toolkit-scripts-loading-from-cdn

Я обновил свой сайт до .NET4, и сейчас яиспользуя тег EnableCDN = "true" scriptManager.На мои Ajax-скрипты ссылаются из Microsoft CDN так, как я ожидал, но я не могу заставить свои скрипты AjaxControlToolkit загружаться из CDN.Вместо этого все они загружаются локально через ScriptResource.axd.

Я знаю, где находятся файлы CDN, и я знаю, что могу ссылаться на эти файлы каждый раз, когда использую элемент управления, но у меня есть много устаревшего кода, который загружается сам по себе из диспетчера сценариев,просто извлеките файлы ScriptResource.axd.

Есть предложения, как получить скрипты набора инструментов управления для загрузки из CDN?У меня уже есть стандартный WebForms.js и т.д.

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" 
EnableCdn="true" EnableScriptLocalization="false" 
LoadScriptsBeforeUI="false" EnableViewState="false" />

Ответы [ 4 ]

11 голосов
/ 10 мая 2011

Если сборка не определяет путь CDN в своих WebResourceAttributes, EnableCDN не будет знать, куда идти. Вот и все.

Однако вы можете определить свой собственный путь CDN, если вы знаете CDN, в котором они есть. Честно говоря, я не знаю, есть ли последний ACT на CDN или нет. Если вы используете версию 40412, то да, это: http://www.asp.net/ajaxlibrary/CDNACT40412.ashx

То, как вы определяете свой собственный путь, описано в моей записи в блоге (также упоминается в другом ответе):
http://weblogs.asp.net/infinitiesloop/archive/2009/11/23/asp-net-4-0-scriptmanager-improvements.aspx

Вот пример, объясненный ниже:

void Application_Start(object sender, EventArgs e) {
    ScriptManager.ScriptResourceMapping.AddDefinition("Foo.js", typeof(FooControl).Assembly, new ScriptResourceDefinition {
        ResourceName = "Foo.js",
        ResourceAssembly = typeof(FooControl).Assembly,
        CdnPath = "http://yadda-yadda/foo.js",
        CdnDebugPath = "http://yadda-yadda/foo.debug.js",
    });
}

Вот что происходит. Прежде всего, существует сборка, назовем ее Foo.dll. В качестве встроенного ресурса он содержит скрипт с именем «Foo.js» (расширение .js необязательно). Таким образом, asp: ScriptReferences (на странице или из серверного элемента управления) к этому ресурсу перейдет в ScriptResource.axd. Атрибут WebResourceAttribute сборки для сценария не определяет путь CDN, поэтому он все равно остается там, если вы включаете CdnMode.

Вы хотите это исправить, так что вы нацеливаетесь на этот скрипт. Для этого вам необходимо обратиться к его сборке и названию. Вместе они идентифицируют скрипт (это «первичный ключ», если хотите). Первые два параметра в AddDefinition выполняют это.

Теперь, когда вы нацелились на него, вы можете полностью переопределить, что значит быть этим сценарием. Вы помещаете его в другую сборку, в другой путь, определяете путь cdn ... что угодно.

Свойства определения ResourceName и ResourceAssembly устанавливают, что скрипт действительно все еще принадлежит той же сборке, из которой он получен. Это может показаться ненужным, если вы все равно собираетесь загружаться из CDN. Но он делает две вещи: (1) он все равно будет работать, если вы выключите CDN, и (2) он все равно сможет выяснить, является ли отладочная версия ресурса (foo.debug.js) или любые версии LOCALIZED ( например, foo.fr-FR.js) существуют в сборке и, таким образом, знают, будет ли CDN содержать эту версию (поскольку она не может очень хорошо проверить это с сервера). Поэтому хорошей идеей будет дать определение владельцу (обратите внимание, что оно НЕ будет иметь значения по умолчанию для исходного владельца, если вы не укажете его).

Свойства CdnPath и CdnDebugPath очевидны, и ваша конечная цель здесь. EnableCdn теперь должен работать!

Я рекомендую вам использовать ScriptMapping, когда это возможно, чтобы определить детали скрипта, а затем ссылаться на них по имени, а не по пути. Сохраняет разметку простой и более СУХОЙ, поскольку вы можете определить все детали для скрипта в одном месте.

СЕЙЧАС ... Как это сделать с помощью AjaxControlToolkit?

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

Одна вещь - попробуйте это на 1 или 2 сценариях ACT, чтобы убедиться, что вы правильно поняли. Также здесь есть еще одна сложность, о которой я не упомянул.

Помните, когда я сказал, что Имя и Сборка собираются вместе, чтобы идентифицировать скрипт (его «первичный ключ»)? Это правда, но есть одно специальное правило для сценариев, которые приходят из System.Web.Extensions ИЛИ так называемой «AjaxFrameworkAssembly». В этом случае указание нулевой сборки или использование перегрузки, когда этот параметр вообще отсутствует, является эквивалентным. Что такое "AjaxFrameworkAssembly"? Что ж, System.Web.Extensions содержит малоизвестную функцию, которая позволяет сборке заявлять о себе как «AjaxFrameworkAssembly» через атрибут уровня сборки. Это означает: «Я - сборка, содержащая MS AJAX-сценарии, вы должны прийти ко мне вместо System.Web.Extensions». ACT использует это для «обновления» сценариев, встроенных в System.Web.Extensions. У него есть свои копии этих скриптов, которые имеют более поздний номер версии. Все, что вам нужно сделать, это сослаться на сборку, и перед этим сценарии автоматически перенаправляются, чтобы прийти оттуда. Дело в том, что вы можете избежать указания сборки во всех этих сопоставлениях. Но попробуй, не поверь мне на слово.

Это был ответ InfinitiesLoop. Теперь я возвращаюсь к вашему регулярному программированию:)

2 голосов
/ 31 марта 2012

Я тоже боролся с этой проблемой и в итоге обнаружил, что сценарии ACT также размещены в CDN, однако в документации не указано, что они есть.

Корневой путь: http://ajax.aspnetcdn.com/ajax/act/40412/

Например, путь к ACT-версии файла MicrosoftAjaxCore.js будет: http://ajax.aspnetcdn.com/ajax/act/40412/MicrosoftAjaxCore.js

Чтобы убедиться, что этот путь всегда используется - выполняется один раз при загрузке приложения, а затем используется на каждой странице, которая использует ToolkitScriptManager - используйте следующие строки кода в Global.asax. Обратите внимание, что вам нужен блок кода / файл скрипта.

ScriptManager.ScriptResourceMapping.AddDefinition("MicrosoftAjaxCore.js", new ScriptResourceDefinition
    {
        ResourceName = "MicrosoftAjaxCore.js",
        CdnPath = "http://ajax.aspnetcdn.com/ajax/act/40412/MicrosoftAjaxCore.js",
        CdnDebugPath = "http://ajax.aspnetcdn.com/ajax/act/40412/MicrosoftAjaxCore.debug.js"
    });

Я также настроил свой ScriptManager с атрибутом FrameworkMode="Disabled" и указывал, какие файлы мне нужны, связывая их с ACT-версией, в противном случае используется версия из System.Web.Extensions. Убедитесь, что вы указали правильную версию ACT.

<asp:ScriptReference Name="MicrosoftAjaxCore.js" Assembly="AjaxControlToolkit, Version=4.1.51116.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
<asp:ScriptReference Name="MicrosoftAjaxComponentModel.js" Assembly="AjaxControlToolkit, Version=4.1.51116.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"  />
<asp:ScriptReference Name="MicrosoftAjaxSerialization.js" Assembly="AjaxControlToolkit, Version=4.1.51116.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"  />
<asp:ScriptReference Name="MicrosoftAjaxNetwork.js" Assembly="AjaxControlToolkit, Version=4.1.51116.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"  />
<asp:ScriptReference Name="MicrosoftAjaxWebServices.js" Assembly="AjaxControlToolkit, Version=4.1.51116.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e"  />
<asp:ScriptReference Name="MicrosoftAjaxWebForms.js" Assembly="AjaxControlToolkit, Version=4.1.51116.0, Culture=neutral, PublicKeyToken=28f01b0e84b6d53e" />
1 голос
/ 18 февраля 2011

Я склоняюсь к ответу: это невозможно.Я хотел бы услышать иначе, но я понимаю, что менеджер сценариев всегда будет извлекать локальные файлы ajaxtoolkit и предоставлять их как ScriptResource.axd.

Как указано в вопросе, я знаю, что вы можете включить свой собственный скриптссылки (на файлы в CDN Microsoft), но тогда вам нужно указать, какие файлы вы хотите / нужны для каждого запроса файла, вместо того, чтобы скрипт-менеджер обрабатывал запросы файла для вас.

0 голосов
/ 04 мая 2011

На самом деле я еще не пробовал, но объяснение в блоге InfinitiesLoop (http://weblogs.asp.net/infinitiesloop/archive/2009/11/23/asp-net-4-0-scriptmanager-improvements.aspx) определенно звучит достаточно разумно.

Теперь в WebResourceAttribute есть новое свойство: CdnPath. Не получитьслишком догоняет тот факт, что это жестко запрограммированный URL. Подробнее об этом позже.

[Assembly: WebResource ("Foo.js", "application / x-javascript", CdnPath = "http://foo.com/foo/bar/foo.js")]

ScriptManager ищет это свойство, когда для свойства EnableCdn установлено значение true, и просто использует этот путь вместо пути ScriptResource.axd к ресурсу сборки. Довольно просто. И это также означает, что вы также можете указать собственные пути CDN для своих собственныхСценарии ресурсов ассемблера. Что касается места размещения вашего скрипта, то это ваше дело.

...