当前位置: 首页 > 面试题库 >

使用ScriptManager / ToolkitManager从Microsoft的CDN加载AjaxControlToolkit脚本

昌乐
2023-03-14
问题内容

我知道还有另一个问题在问同样的事情,但几个月来一直没有引起任何关注:https://stackoverflow.com/questions/3786088/how-to-force-ajax-control-toolkit-
scripts-loading -从CDN

我已经将网站升级到.NET4,现在正在使用scriptManager的EnableCDN =“
true”标签。我的Ajax脚本正按照我的预期从Microsoft
CDN引用,但是我似乎无法从CDN加载我的AjaxControlToolkit脚本。相反,它们都通过ScriptResource.axd在本地加载。

我知道CDN文件的位置,并且我知道每次使用控件时都可以引用这些文件,但是我有很多旧代码可以从scriptmanager自身加载,只是提取ScriptResource.axd文件。

关于如何从CDN加载控制工具包脚本的任何建议?我已经有了标准的WebForms.js等。

让我知道是否有什么可以清除的,这是我正在使用的脚本管理器:(我已经尝试过toolkitscriptmanager)

<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" 
EnableCdn="true" EnableScriptLocalization="false" 
LoadScriptsBeforeUI="false" EnableViewState="false" />

问题答案:

如果程序集未在其WebResourceAttributes中定义CDN路径,则EnableCDN将不知道要去哪里。就是这样。

但是,如果您知道具有它们的CDN,则可以定义自己的CDN路径。老实说,我不知道最新的ACT是否在CDN上。如果您使用的版本是40412,则是,它是:http
:
//www.asp.net/ajaxlibrary/CDNACT40412.ashx

我的博客条目(在另一个答案中也提到)中描述了定义自己的路径的方法:http :
//weblogs.asp.net/infinitiesloop/archive/2009/11/23/asp-net-4-0-scriptmanager
-improvements.aspx

这是一个示例,说明如下:

void Application_Start(object sender, EventArgs e) {
    ScriptManager.ScriptResourceMapping.AddDefinition("Foo.js", typeof(FooControl).Assembly, new ScriptResourceDefinition {
        ResourceName = "Foo.js",
        ResourceAssembly = typeof(FooControl).Assembly,
        CdnPath = "http://yadda-yadda/foo.js",
        CdnDebugPath = "http://yadda-yadda/foo.debug.js",
    });
}

这是正在发生的事情。首先,存在一个程序集,将其命名为Foo.dll。它包含一个脚本,该脚本作为名为“
Foo.js”的嵌入式资源(.js扩展名是可选的)。因此,对该资源的asp:ScriptReferences(在页面上或来自服务器控件)将转到ScriptResource.axd。脚本的程序集的WebResourceAttribute没有定义CDN路径,因此,如果您打开CdnMode,它仍会到达该路径。

您想解决该问题,所以您要做的是针对该脚本。为此,您必须引用其程序集和名称。他们一起识别脚本(如果需要的话,它是“主键”)。AddDefinition的前两个参数可以完成此任务。

现在您已将其作为目标,现在您将完全重新定义成为该脚本的含义。您将其放在另一个程序集,另一个路径中,定义cdn路径。

定义的ResourceName和ResourceAssembly属性确定该脚本确实仍属于它来自的同一程序集。如果您仍然要从CDN加载,那似乎没有必要。但是它有两件事:(1)如果您关闭CDN,它仍然可以工作;(2)它仍然能够确定资源的调试版本(foo.debug.js)还是任何LOCALIZED版本(例如foo.fr-
FR.js)存在于程序集中,从而知道CDN是否将包含该版本(因为它不能很好地从服务器检查该版本)。因此,给定义一个所有者是一个好主意(请注意,如果您不指定它们,它将不会默认为原始所有者)。

CdnPath和CdnDebugPath属性是显而易见的,这是您的最终目标。EnableCdn现在应该可以工作了!

我鼓励您尽可能使用ScriptMapping定义有关脚本的详细信息,然后通过名称而不是路径来引用它们。由于您可以在一处定义脚本的所有详细信息,因此可以使标记保持简单且更加干燥。

现在…如何使用AjaxControlToolkit做到这一点?

您将必须为工具箱中的每个脚本编写这些映射之一。那不会很有趣,其中有数十种。不过,不要为每个发行版和调试脚本编写单独的脚本。两者是一对,并使用1个映射定义。其中也有一些本地化版本,但我不会对此感到烦恼-
消息是针对开发人员的错误消息,无论如何,它们实际上并不需要本地化,因为该功能旨在将内容本地化为最终内容。用户。

一件事-在1或2个ACT脚本上尝试一下,以确保正确。另外,这里我没有提到另一种复杂性。

还记得我说过“名称”和“程序集”共同标识一个脚本(其“主键”)吗?是的,但是对于来自System.Web.Extensions或所谓的“
AjaxFrameworkAssembly”的脚本有一个特殊的规则。在那种情况下,指定空程序集或在完全缺少该参数的情况下使用重载是等效的。什么是“
AjaxFrameworkAssembly”?好吧,System.Web.Extensions包含一个鲜为人知的功能,该功能允许程序集通过程序集级别属性将其声明为“
AjaxFrameworkAssembly”。这样做意味着“我是包含ms
ajax脚本的程序集,您应该来找我,而不是System.Web.Extensions”。ACT使用此命令来“升级”
System.Web.Extensions中嵌入的脚本。它具有这些脚本的副本,这些副本具有更高的版本号。您所需要做的就是引用程序集,并且,脚本会自动重定向到那里。这里的要点是,您可能可以不用在所有这些映射中指定程序集而摆脱困境。但是,尝试一下,不要相信我。

这是InfinitiesLoop的答案。我现在将您带回您定期安排的节目:)



 类似资料:
  • 我想用cdn的axios 但是我得到了一个错误:拒绝加载脚本的https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js'因为它违反了以下内容安全策略指令:“script src'self'”。请注意,未显式设置“script src elem”,因此将“script src”用作回退。

  • 问题内容: 您实际上使用哪个CDN链接到您的jquery文件或任何javascript文件是否重要?一个可能比另一个更快吗?您决定在哪个CDN中使用哪些其他因素?我知道Microsoft,Yahoo和Google现在都具有CDN。 问题答案: 根据评论更新: 简短版:没什么关系,但可能取决于他们托管的内容。他们都拥有不同的东西:谷歌没有托管jQuery.Validate,微软没有托管jQuery-

  • 本文向大家介绍使用CDN和AJAX加速WordPress中jQuery的加载,包括了使用CDN和AJAX加速WordPress中jQuery的加载的使用技巧和注意事项,需要的朋友参考一下 确定要放在Head部分 ? 事实上最好的情况是,js文件都不要在<head>部分进行加载,否则会影响到head部分的载入速度,直接导致网站的内容(body)载入延迟。如果你确定你不需要在head部分载入jQuer

  • 嗨,我正试图从pdb文件中读取数据 是否有其他方法打开MS pdb文件,并具体提取GUID

  • 问题内容: 我打算使用Google下载UI和Core的jQuery库。我的问题是,他们允许我为此下载CSS还是应该自己托管它? 另外,如果我使用Google加载,应该如何加载其他插件?我可以将所有插件压缩在一起吗,还是应该将其单独压缩? 问题答案: Google AJAX库API,其中包括jQuery UI(当前为v1.10.3),还包括热门主题: Google Ajax库API(CDN) The

  • 问题内容: 我想从CDN加载脚本,然后在React中执行该脚本公开的功能: 该脚本有时需要花费一些时间(通常是第一次)加载,并且何时调用“ foo”不可用,并且出现如下错误: TypeError:无法读取未定义的属性“ render” 如何确保脚本成功加载后调用? 问题答案: 根据React Component Specs和Lifecycle的说法,我认为在componentWillMount()