14

将 javascript 文件标记为“嵌入的资源”
向我的 AssemblyInfo 类添加了 WebResource 属性

现在我正在尝试将嵌入的 javascript 输出到我的母版页。我得到的只是来自网络资源网址的“未找到网络资源”。


项目组合名称:

CompanyProduct


项目默认命名空间:

Company.Product.Web


Javascript 文件位于:
Library/navigation.js


装配信息:

[assembly: WebResource("CompanyProduct.Library.navigation.js", "text/javascript")]


母版页中的代码:

Page.ClientScript.RegisterClientScriptInclude("NavigationScript", Page.ClientScript.GetWebResourceUrl(this.GetType(), "CompanyProduct.Library.navigation.js"));

“/”应用程序中的服务器错误。

无法找到该资源。

说明: HTTP 404。您要查找的资源(或其依赖项之一)可能已被删除、名称已更改或暂时不可用。请查看以下 URL 并确保其拼写正确。

请求的 URL: /WebResource.axd
版本信息:  Microsoft .NET Framework 版本:2.0.50727.1433;ASP.NET 版本:2.0.50727.1433

4

15 回答 15

14

而不是this.GetType(),从包含资源的程序集中获取类型..即:

typeof(Company.Product.Web.Library.Class1)

那样有用吗?

于 2009-02-08T16:45:51.543 回答
4

今天遇到了同样的问题。问题似乎是 AssemblyResourceLoader 使用包含提供给GetWebResourceUrl方法(第一个参数)的类型的程序集,在您的情况下,该程序集是为母版页(.master)动态创建的程序集,并且不包含您正在寻找的资源。我假设您的资源文件包含在与基本母版页(.master.cs 文件)相同的程序集中,然后您可以使用它typeof来获取 Type 实例

Page.ClientScript.RegisterClientScriptInclude(
   "NavigationScript",
   Page.ClientScript.GetWebResourceUrl(
      typeof(MyMasterPage),
      "CompanyProduct.Library.navigation.js"));

其中 MyMasterPage 是您的母版页的名称

看起来也可以使用在嵌入资源的同一程序集中声明的任何其他类型。

于 2010-08-09T13:06:38.383 回答
3

我认为您希望完整路径基于命名空间,而不是程序集;因此,在您拥有“CompanyProduct.Library.navigation.js”的任何地方,将其替换为“Company.Product.Web.Library.navigation.js”。此外,还有一种方法 Page.ClientScript.RegisterClientScriptResource() 可以在一种方法中完成您需要的工作(而不是使用 RegisterClientScriptInclude(GetWebResourceUrl())。

于 2008-11-26T13:36:37.580 回答
1

这有点抓住了稻草,但可能是您的 asp.net 没有设置为正确处理 webresource.axd 吗?如果出现问题,可能机器的 web.config 中缺少处理程序标记?

C:\Windows\Microsoft.NET\Framework\v2.0.50727\CONFIG\web.config 的 http 处理程序标记应该有一个 webresource.axd 条目,如下所示:

<httpHandlers>
    <add path="WebResource.axd" verb="GET" type="System.Web.Handlers.AssemblyResourceLoader" validate="True"/>
</httpHandlers>

还要仔细检查项目的 web.config 中没有任何可能覆盖机器 web.config 设置的处理程序条目。

于 2009-02-26T23:24:21.690 回答
1

这个博客已经有两年历史了……但我花了几天时间试图让它发挥作用。试图获得一个嵌入式 js 文件以实际给我一个可以工作的 WebResource.asx 查询字符串。似乎在这里被掩盖的最后一点是,您嵌入的文件必须与您从中调用的控件代码隐藏位于相同的物理目录结构中GetWebResourceUrl()。如果您将嵌入文件放在名为“scripts”的文件夹中,然后GetWebResourceUrl()从“scripts”中找不到的母版页调用,则返回的 ResourceURL 将指向错误的位置......因此总是返回 404。

如果您使用 MasterPage 作为第一个参数的类型,那么它将永远无法工作。 GetWebResourceUrl(typeof(MasterPage),... 我想这里真正的关键是您必须将嵌入的资源放到您将用作 ResourceURL 的第一个参数的类型的相同位置。经过3天的努力,它终于找到了我的资源。

于 2010-12-14T20:29:40.493 回答
1

对于碰巧使用 VB 的任何人 - VB 编译器和 C# 编译器之间的行为存在差异。

在 VB 中,嵌入式资源必须位于项目的根级别。当我使用 ILDASM 查看生成的程序集时,我发现嵌入资源的名称从不包含任何子文件夹的名称。这最终会导致 AssemblyLoader 在错误的位置查找嵌入的资源。

当您使用 C# 重复实验时,它确实包含子文件夹的名称。

编辑 - 更改以反映 VB 必须位于根级别的资源。

我成功的是将嵌入资源与使用它的代码放在同一个文件夹中(更好地进行源代码控制)。然后我在 Attribute 和 Page.ClientScript.GetWebResourceUrl 调用中撒谎,以说明 VB 编译器声称嵌入的资源没有路径。

于 2012-02-21T21:43:31.883 回答
1

刚遇到这个问题,根据meandmycode的回复解决了;但是,也许需要更详细的解释。

当您使用该ScriptManager.RegisterClientScriptInclude方法注册脚本块时,“type”参数必须属于与 .js 脚本相同的项目中的类。如果您没有与脚本块关联的类,您将只需要选择另一个类。

于 2013-01-31T23:22:41.810 回答
1

我遇到了类似的问题,就我而言,这是由于Page.ClientScript.GetWebResourceUrl resourceName参数区分大小写而引起的。

于 2013-10-22T16:10:31.653 回答
0

您的问题的答案完全取决于您在实际项目中拥有此文件的位置,以及默认命名空间是什么。正如 Chris 所提到的,您为注册脚本的方法提供的路径需要正确的路径来定位嵌入的资源。您不只是匹配您在 AssemblyInfo 中指定的字符串。该字符串必须是资源的正确路径。

<默认项目命名空间>/<文件所在的任何子文件夹>/<文件名>

于 2008-11-26T23:13:43.360 回答
0

转这个;

Page.ClientScript.RegisterClientScriptInclude("NavigationScript"...

进入这个;

Page.ClientScript.RegisterClientScriptInclude("CompanyProduct.Library.navigation.js"...
于 2008-11-27T00:37:21.613 回答
0

您在不同程序集中添加的资源是否与您用于生成脚本标记的代码不同?如果是这种情况,我认为 this.GetType() 将返回对错误程序集中类型的引用,因此 Web 资源代码将没有正确的程序集来加载资源。

我不确定这会是一个问题,但在我看来,生成名称的代码需要知道资源所在的程序集,否则它无法映射回该程序集收到来自浏览器的请求。

于 2009-02-27T07:24:49.743 回答
0

我也遇到过类似的情况,经过大约 4 个小时的研究和测试,我得到了最终的解决方案:Default Namespace 必须与 Assembly Name 相同
(可以使用 Reflector 或使用下面的代码片段来获取嵌入资源的名称。

string[] embeddedResNames = Assembly.LoadFile("YourDll.dll").GetManifestResourceNames()
于 2011-04-21T14:19:44.843 回答
0

正如meandmycode已经提到的,传递给的类型GetWebResourceUrl是关键

我不喜欢在无关紧要的地方传递类型,我用这种辅助方法解决了它

static public string GetEmbeddedResourceLink(Page page, string assemblyName, string resource) {
    var assembly = Assembly.Load(assemblyName);
    var types = assembly.GetTypes();
    if (types.Length == 0) {
        throw new ArgumentException("assembly does not contain any type");
    }
    return page.ClientScript.GetWebResourceUrl(types[0], resource);
}
于 2011-10-27T11:58:25.423 回答
0

[assembly: ] 属性必须在 Properties\AssemblyInfo.cs 文件中。即使在程序集属性位于自定义控制文件中时编译项目,它们对 WebResource.axd 也是不可见的。

于 2013-02-08T09:00:47.943 回答
0

在这里尝试了大多数解决方案之后,我遇到了另一个有效的 StackOverflow 答案

DLL 上标记的时间必须在当前时间之后,否则WebResource.axd将无法从中提供资源。

这种机制似乎完全不知道时区差异。如果您的 CI 服务器位于比您的目标 Web 服务器更东的时区,则区域之间的时差会导致资源不可用,直到 Web 服务器时间达到 DLL 上的时间。解决方案是使用构建脚本中的Set-TimeZone确保您的 CI 代理的时区设置为与您的目标服务器相同(或更西) 。

当然,理想的解决方案是将所有服务器设置为 UTC,但并非所有应用程序都被编码为与时区无关。

于 2020-10-20T16:58:09.120 回答