Использование Microsoft Ajax Library 3.5 с CDN
Недавно Microsoft анонсировала Microsoft Ajax content delivery network (CDN), которая может значительно увеличить производительность любого веб приложения, использующего ASP.NET AJAX. Когда эта технология была анонсирована, CDN была почти бесполезной для существующих веб-приложений основанных на ASP.NET 3.5 так как CDN не содержала Microsoft Ajax library 3.5 и не поддерживала работу через SSL. Однако через небольшой период времени Microoft смогла устранить эти проблемы и теперь веб приложения, построенные на базе ASP.NET 3.5 также могут использовать Microsoft Ajax CDN.
Итак, каким же образом вы можете заставить линк на MicrosoftAjax.js ссылаться на CDN вместо того, чтобы использовать файл, хранящийся в ресурсах DLL на вашем сервере? На самом деле очень просто при момощи ScriptManager. Добавьте следущее определение на Page (или Master page) на которой есть ScriptManager control:
<asp:ScriptManager runat="server" EnablePartialRendering="false">
<scripts>
<asp:ScriptReference Name="MicrosoftAjax.js"
Path="http://ajax.microsoft.com/ajax/3.5/MicrosoftAjax.js" />
</scripts>
</asp:ScriptManager>
Эта декларация означает, что скрипт с именем MicrosoftAjax.js, на который всегда автоматически ссылается ScriptManager загружая его из System.Web.Extensions dll сейчас должен быть загружен с этого местоположения: ajax.microsoft.com/ajax/3.5/MicrosoftAjax.js.
Вот такая ссылка будет использована по умолчанию:
<script src="/ScriptResource.axd?d=eYUqBJhfSVL41hIDYkBL0tfaps9hoQId_
48PydfbcyWH41vNvL68sk-l7P9FLAPz7b4vtI8WkZ-ezAF0b_ZkyG52wt9oU
taQ5ezFfGBr7LY1&t=ffffffffef976216"
type="text/javascript">
</script>
а вот так это будет выглядеть после того, как мы добавим описанные выше определения в ScriptReference:
<script src="http://ajax.microsoft.com/ajax/3.5/MicrosoftAjax.js"
type="text/javascript">
</script>
Более того, ScriptManager даже достаточно умен чтобы автоматически использовать отладочную версию скрипта MicrosoftAjax.debug.js из CDN если включен режим отладки в файле web.config:
<compilation debug="true">
<script src="http://ajax.microsoft.com/ajax/3.5/MicrosoftAjax.debug.js"
type="text/javascript">
</script>
Итак, тут все понятно: мы используем MicrosoftAjax.js из CDN и это улучшает производительность нашего веб приложения и сохраняет нам и нашим посетителям некоторое количество трафика так как браузер будет повторно использовать ту же самую кешированную копию MicrosoftAjax.js из CDN для всех веб приложений, которые на него ссылаются.
Использование условной загрузки скриптов из CDN
Что если мы хотим использовать MicrosoftAjax.js из CDN только когда веб приложение было опубликовано на рабочий сервер и использовать встроенный скрипт когда мы разрабатываем сайт? Это может иметь смысл в случае, когда программисты ведут разработку не имея соединения с Internet. Такой вариант тоже возможен, но в этом случае нам необходимо написать немного кода. Мы собираемся добавить ссылку на MicrosoftAjax.js динамически, в зависимости от значения переменной debug в файое web.config; мы добавляем необходимую ссылку только для случая, когда debug=«false»:
protected void Page_Load(object sender, EventArgs e)
{
if (!Context.IsDebuggingEnabled)
{
ScriptManager sm = ScriptManager.GetCurrent(this);
sm.Scripts.Add(new ScriptReference {Name = "MicrosoftAjax.js",
Path = "http://ajax.microsoft.com/ajax/3.5/MicrosoftAjax.js"});
}
}
Использование CDN через SSL
Другой важный случай — наше веб приложение имеет страницы, которые должны работать с использованием SSL. В этом случае мы автоматически выбираем корректный CDN URL для MicrosoftAjax.js. Чтобы это сделать мы всего лишь немного модифицируем предыдущий код:
protected void Page_Load(object sender, EventArgs e)
{
if (!Context.IsDebuggingEnabled)
{
ScriptManager sm = ScriptManager.GetCurrent(this);
sm.Scripts.Add(new ScriptReference {Name = "MicrosoftAjax.js",
Path = Request.Url.Scheme +"://ajax.microsoft.com/ajax/3.5/MicrosoftAjax.js"});
}
}
Проблемы с локализацией
При использовании локализации скриптов, которая может иметь место скажем, если вы используете AJAX Control Toolkit выявилась неприятная проблема: вместо корректного адреса MicrosoftAjax.js ScriptManager пытается загрузить локализованную версию скрипта, которой на сайте нет и приложение падает с ошибкой. Эту проблему можно обойти, если использовать еще один параметр для создания ScriptReference, предназначенный для указания языков, для которых поддерживается локализация данного скрипта. Если язык пользователя, который отдает браузер не содержится в этом списке будет загружена версия скрипта, используемая по умолчанию. В списке языков можно использовать любые строки что в данном случае нам на руку. Модифицируем код примера следующим образом указав в качестве поддерживаемого языка локализации «none»:
sm.Scripts.Add(new ScriptReference {Name = "MicrosoftAjax.js",
Path = "http://ajax.microsoft.com/ajax/3.5/MicrosoftAjax.js"},
ResourceUICultures = new string[]{ "none" } });
* This source code was highlighted with Source Code Highlighter.
Теперь всегда будет загружаться правильная версия скрипта.
P.S. Изначально я перевел и разместил эту статью в своем персональном блоге: blog.dvteam.ru. (Оригинал статьи находится тут: blog.turlov.com/2009/11/using-microsoft-ajax-library-35-with.html)
Не удержался и продублировал ее на хабре. Тема интересная, и не хотелось бы чтобы информация потерялась на моей мало кому известной странице.Это мой первый топик, прошу сильно не пинать и не лениться писать в комментариях если ставите минус за что я его получил. Я не телепат и не могу учитывать ваше мнение, если вы его не высказываете.
Большое спасибо Pavel_Osipov за помощь в подсветке кода