如何强制ScriptManager通过SSL提供CDN脚本

时间:2011-11-22 04:28:02

标签: c# asp.net ssl cdn scriptmanager

我们在网络服务器场上提供了一个网站。该农场是处理加密的SSL Accellerator的幕后推手。这意味着我们的IIS服务器将所有传入连接视为http,即使用户都通过https连接到该站点。

我们开始使用ScriptManager的EnableCDN = true属性。在没有SSL Accellerator的开发环境中,CDN上的js文件的引用是使用https呈现的,在生产环境中它们通过http不安全地呈现,这导致js被阻止“仅显示安全内容“错误。

如果没有手动更新scriptmanager中的所有脚本引用或通过模块重新编写HTML,有没有人知道强制脚本管理器通过https呈现其引用的方法?

编辑:

在做了一些反射器审查后,我不相信这是可能的。我已经将下面的hack放到了适当位置,但是这显然是脆弱的,因为它涉及访问私有字段。如果有人能够看到更好的方式,我很乐意听到它。

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

5 个答案:

答案 0 :(得分:1)

如果您使用ASP.NET 4.0或更高版本,则其中一个解决方案是使用ScriptManager控件的ScriptResourceMapping功能。

例如,在全局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

答案 1 :(得分:1)

为了处理与您类似的情况,我将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>

两者都将在浏览器上使用正确的协议。

答案 2 :(得分:0)

通常,您的开发和生产服务器将具有不同的IP范围。要求开发团队根据框架dll中的IP地址应用“协议切换”。

答案 3 :(得分:0)

您正在使用@Razor ASPX,我假设您某处有Layout / MasterPage

<强>的CDN &#39;真正的力量在于特别是从服务器以外的其他来源远程托管脚本。这样做会提示用户的浏览器更有可能从其他位置拾取它。 CDN对核心库表现最佳,例如AngularJSjQuery。您导入的脚本越不流行,建议通过CDN提供的内容越少。

我觉得它更适合在你的布局上进行硬编码。如果您只使用//而不是使用http://https://指定协议,那么它应该选择调用该页面的相同协议。

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

如果您在本地压缩/缩小远程CDN,则会失败。最好使用NuGetBower

检查Google CDNs

答案 4 :(得分:-1)

使用此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"

});

}