Как заставить ScriptManager обслуживать скрипты CDN через SSL

У нас есть сайт, обслуживаемый веб-фермой. Ферма находится за SSL Accellerator, который обрабатывает шифрование. Это означает, что наши серверы IIS видят все входящие соединения как http, хотя пользователи все подключаются к сайту через https.

Мы начинаем использовать свойство EnableCDN = true ScriptManager. Хотя в наших средах разработчиков, где нет SSL Accellerator, ссылки на js файлы на CDN отображаются с помощью https, в производственной среде они отображаются неуверенно по http, из-за чего js блокируется "Отображается только защищенный контент" ".

Не удалось вручную обновить все ссылки script в scriptmanager или переписать HTML-код на выходе через модуль, знает ли кто-нибудь о том, как заставить scriptmanager отображать его ссылки через https?

EDIT:

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

var secureConnectionField = ScriptManager.GetType().GetField("_isSecureConnection", BindingFlags.Instance | BindingFlags.NonPublic);
if (secureConnectionField != null)
    secureConnectionField.SetValue(ScriptManager, true);

Ответ 1

Если вы используете ASP.NET 4.0 или выше, то одним из решений является использование функции ScriptResourceMapping элемента управления ScriptManager.

Например, в глобальном asax вы можете добавить следующий код:

void Application_Start(object sender, EventArgs e) {

// map a simple name to a path

ScriptManager.ScriptResourceMapping.AddDefinition("jQuery", new ScriptResourceDefinition {

    Path = "~/scripts/jquery-1.3.2.min.js",

    DebugPath = "~/scripts/jquery-1.3.2.js",

    CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js",

    CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js"

});

}

Итак, как вы можете видеть, вы можете явно указать пути CDN. Кроме того, вы можете переопределить отображение script для стандартных файлов Ajax.

Дополнительную информацию можно найти в этой статье: http://weblogs.asp.net/infinitiesloop/archive/2009/11/23/asp-net-4-0-scriptmanager-improvements.aspx

Ответ 2

Чтобы справиться с ситуацией, подобной вашей, я настроил BundleCollection на использование CDN и двух разных версий библиотеки для отладки и производства.

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

[...]  
bundles.UseCdn = true;
[...]
var jQueryBundle = new ScriptBundle("~/bundles/jquery");
jQueryBundle.CdnPath = "//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js";
jQueryBundle.Include("~/scripts/jquery-1.9.1.js");
jQueryBundle.Include("~/scripts/jquery-1.9.1.min.js");
bundles.Add(jQueryBundle);

Обратите внимание, что я не указал протокол в CdnPath, клиентский браузер будет автоматически использовать текущий протокол, с которым клиент подключен, http или https.

В браузере клиента будет получен следующий тег:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.9.1/jquery.min.js"></script>

Браузер разработчика получит следующий тег:

<script src="/Scripts/jquery-1.9.1.js"></script>

Оба будут использовать правильный протокол в браузере.

Ответ 3

Обычно ваши серверы разработки и производства будут иметь разные диапазоны IP. Попросите команду разработчиков применить "протокол-коммутатор" на основе IP-адресов в инфраструктурных DLL файлах.

Ответ 4

Вэтер вы используете @Razor it ASPX, я предполагаю, что у вас есть Layout/MasterPage.

CDNs "истинная сила заключается в том, что у него script удаленно размещен из другого источника, кроме вашего сервера. Это приводит к более вероятному появлению браузера пользователя из другого места. CDN лучше всего подходят для основных библиотек, таких как AngularJS или jQuery. Чем менее популярна script, которую вы импортируете, тем менее рекомендуется использовать ее через CDN.

Я нахожу его более подходящим для жесткого кода - это на вашем макете. Если вы используете только // вместо указания протокола с помощью http:// или https://, он должен выбрать тот же протокол, который вызывается на странице.

<script type="text/javascript" src="//{yourCDNsource}"></script>

Если вы локально сжимаете/уменьшаете удаленный CDN, он побеждает цель. Лучше использовать NuGet или Bower для них.

Проверьте Google CDN

Ответ 5

Используйте этот файл global.asax

void Application_Start(object sender, EventArgs e) {

// map a simple name to a path

ScriptManager.ScriptResourceMapping.AddDefinition("jQuery", new ScriptResourceDefinition {

    Path = "~/scripts/jquery-1.3.2.min.js",

    DebugPath = "~/scripts/jquery-1.3.2.js",

    CdnPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.min.js",

    CdnDebugPath = "http://ajax.microsoft.com/ajax/jQuery/jquery-1.3.2.js"

});

}