ASP.NET Bundle是否支持引入解决方案外的外部托管静态资源文件?
报错根本原因
默认的ScriptBundle.Include方法仅支持当前应用内的相对路径(~/开头的路径),直接传入外部绝对URL就会触发 "Only application relative URLs (~/url) are allowed." 报错。
根据你的需求场景,可以选择以下两种可行方案:
方案1:使用官方CDN支持(推荐,无需自定义改造)
如果你的需求只是让页面最终引用外部托管的JS文件,不需要把该外部文件和本地其他文件合并打包,用官方内置的CDN配置即可:
- 先全局开启CDN使用开关
BundleTable.EnableCdn = True
- 使用
ScriptBundle的双参数构造函数,第二个参数传入外部资源的地址
' 拼接外部托管的jQuery文件地址 Dim jqueryCdnPath = $"{apiBaseUrl}/jquery-2.1.1.min.js" bundles.Add(New ScriptBundle("~/bundles/jquery", jqueryCdnPath).Include( ' 此处填写本地备用文件路径,CDN加载失败时会自动降级使用本地资源 "~/jquery-2.1.1.min.js" ))
如果不需要本地降级资源,也可以配置CdnFallbackExpression实现前端侧的资源可用性校验,无需在本地存放对应文件,示例:
Dim jqueryBundle = New ScriptBundle("~/bundles/jquery", jqueryCdnPath) ' 校验CDN加载的jQuery是否生效 jqueryBundle.CdnFallbackExpression = "window.jQuery" bundles.Add(jqueryBundle)
方案2:自定义VirtualPathProvider实现外部资源合并打包
如果你需要把外部托管的JS文件和本地其他JS文件合并压缩成同一个打包后的Bundle文件,需要自定义虚拟路径提供者来让Bundle可以读取外部资源内容:
- 新建类继承
VirtualPathProvider,重写FileExists、GetFile方法,当路径匹配你约定的外部资源标识时,通过HTTP请求拉取外部资源的内容返回 - 在应用启动时将自定义的
VirtualPathProvider注册到HostingEnvironment.VirtualPathProvider - 之后即可在
Include方法中使用约定的虚拟路径来引入外部资源,实现跨域资源的合并打包
内容的提问来源于stack exchange,提问作者JanT
相关产品推荐
相关产品推荐

