我们在网络服务器场上提供了一个网站。该农场是处理加密的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);
答案 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对核心库表现最佳,例如AngularJS
或jQuery
。您导入的脚本越不流行,建议通过CDN提供的内容越少。
我觉得它更适合在你的布局上进行硬编码。如果您只使用//
而不是使用http://
或https://
指定协议,那么它应该选择调用该页面的相同协议。
<script type="text/javascript" src="//{yourCDNsource}"></script>
如果您在本地压缩/缩小远程CDN,则会失败。最好使用NuGet
或Bower
。
答案 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"
});
}