在Webresource.axd中使用嵌入式web资源



问题很简单:如何在asp.net应用程序中使用嵌入式资源?在程序集中包括资源的步骤是什么,以及如何引用它?可能遇到的陷阱是什么?

编辑:对于没有引用Page和ClientScript的版本,请参见在Razor视图上处理嵌入式资源的正确方法是什么?

花了半天的时间,我学到了这些:

  1. 要嵌入资源,需要将构建操作设置为嵌入式资源(在VS解决方案资源管理器中右键单击文件->属性)

  2. next assemblyinfo .vb必须修改以使该资源可用于WebResource查询。将[Assembly: System.Web.UI.WebResource("MyWebResourceProj.Test.css", "text/css")]添加到项目MyProject文件夹下的AssemblyInfo.vb中。

    • 名称由根命名空间/程序集名称+'.'+文件名组成。要100%确定名称,请使用以下代码片段进行查找:
      Dim resNames = Assembly.LoadFile("YourDll.dll").GetManifestResourceNames()
    • 注意程序集的根命名空间必须与程序集名称相同(这花了我大约4个小时来实现。至少在。net v4中是这样的)
    • 如果css (<%=WebResource("NS.image.jpg")%>)中有引用,则为该css的WebResource属性传递PerformSubstitution:=true。
  3. 引用资源可以用Page.ClientScript.GetWebResourceUrl(GetType(MyWebResourceProj.ConssumingPage), "MyWebResourceProj.Test.css")

    • 请注意,可以使用Me.GetType()代替GetType(Typename),但是,如果类是继承的,这将不起作用,所以要小心!

资源:

  • 调试ASP。. NET 2.0 Web资源:解密URL并获取资源名

通过WebResource使用嵌入式资源。从你自己的回答中可以看出,这是一个令人头疼的问题。您必须保持assemblyinfo.vb|cs同步,并且似乎总是几乎不可能获得所有的名称空间&程序集名称在所有正确的位置。

当你最终让它工作时,你的奖励是一个包含脚本行,看起来像一个核心内存转储。

我建议一个替代方案。自己编写一个非常简单的web处理程序(例如MyResourceLoader.ashx)。然后在你的类中添加一个方法,以任何你认为有意义的方式为它自己的嵌入资源提供服务。您可以使用反射来获取类,就像WebResource所做的那样,或者只是将您需要的任何东西硬编码到您的加载器中,如果它只是用于特定目的的话。类中的公共方法可能看起来像:

public static Stream GetResource(string resourceName) {
   // get the resource from myself, which is easy and doesn't require 
   // anything in assemblyinfo, and return it as a stream. As a bonus, 
   // you can parse it dynamically or even return things that aren't
   // just embedded, but generated completely in code!
}

或者如果你决定做一些更通用的东西,你可以变得更花哨,使用一个类返回更多的数据,例如

class ResourceInfo
{
    public Stream Data;
    public string MimeType;
    public string FileName;
}

现在你有能力以任何你想要的方式提供你的嵌入式资源,例如

<script language="javascript" src="/MyResourceLoader.ashx/MyControlScript.js">

我认为微软把WebResource业务搞得一团糟。幸运的是,做你自己的事情很简单。

最新更新