Как заставить 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"
});
}