CDN脚本故障转移机制

CDN script failover mechanism

我在 MVC 应用程序中使用脚本包来使用以下代码从 CDN 加载脚本:

bundles.Add(new ScriptBundle("~/bundles/jqueryValidate", "//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js").Include("~/Scripts/jquery.validate.min.js"));

如果 CDN 失败,它应该从本地存储库(从项目内部)加载脚本。

我已添加:

bundles.UseCdn = true;

BundleTable.EnableOptimizations = true;

确保先加载 CDN。

当我从我的网络(public 网络)尝试时,它工作正常:脚本从 CDN 加载没有任何问题。

如果我从我的客户网络(公司网络)尝试,CDN 被阻止并且没有加载替换脚本。我不明白为什么我设置的故障转移机制不起作用。

你知道为什么会这样吗?

您使用的代码不是故障转移代码。如果你看一下 the docs for this 它明确指出如果你只是 运行

bundles.Add(new ScriptBundle("~/bundles/jqueryValidate", "//ajax.aspnetcdn.com/ajax/jquery.validate/1.11.1/jquery.validate.min.js").Include("~/Scripts/jquery.validate.min.js"));

CDN 将在生产中加载,Include 路径将在调试中加载。然后他们说

jQuery will be requested from the CDN while in release mode and the debug version of jQuery will be fetched locally in debug mode. When using a CDN, you should have a fallback mechanism in case the CDN request fails. The following markup fragment from the end of the layout file shows script added to request jQuery should the CDN fail.

他们甚至给你一个示例代码

    <script type="text/javascript">
        if (typeof jQuery == 'undefined') {
            var e = document.createElement('script');
            e.src = '@Url.Content("~/Scripts/jquery-1.7.1.js")';
            e.type = 'text/javascript';
            document.getElementsByTagName("head")[0].appendChild(e);

        }
    </script> 

作为检查以确保 CND 已加载,如果没有则进行故障转移。

如果您在 .Net 4.5 上使用 MVC,请查看 CdnFallbackExpression 调用以让它为您自动生成、检查和回退。

您可能还会发现 this blog from Scott Hanselman 也有帮助。