Как заставить ScriptManager обслуживать сценарии CDN через SSL - PullRequest
11 голосов
/ 22 ноября 2011

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

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

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

РЕДАКТИРОВАТЬ:

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

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

Ответы [ 5 ]

1 голос
/ 10 апреля 2013

Чтобы справиться с ситуацией, аналогичной вашей, я настроил 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>

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

1 голос
/ 11 ноября 2012

Если вы используете 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.Кроме того, вы можете переопределить сопоставление сценариев для стандартных файлов Ajax.

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

0 голосов
/ 16 апреля 2014

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

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

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

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

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

Проверка Google CDNs

0 голосов
/ 23 марта 2013

Используйте этот 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"

});

}
0 голосов
/ 15 декабря 2011

Обычно ваши серверы разработки и производства будут иметь разные диапазоны IP-адресов. Попросите группу разработчиков применить «переключатель протокола» на основе IP-адресов в dll платформы.

...