鸟食轩

 Microsoft .NET[C#] MVP 2003
随笔 - 427, 文章 - 234, 评论 - 5468, 引用 - 346
数据加载中……

使用ASP.NET 2.0提供的WebResource管理资源

    ASP.NET(1.0/1.1)给我们提供了一个开发WebControl的编程模型,于是我们摆脱了asp里面的include模式的复用方式。不过1.0/1.1提供的Web控件开发模型对于处理没有image、css等外部资源的组件还算比较得心应手,script虽然很多时候也是外部资源,但在开发控件的时候我们习惯把script使用Page.Register...Script()来嵌入模块,因为紧凑的东西更便于我们复用,用一个dll就可以解决问题又何必要节外生枝呢。

     ASP.NET 2.0提供的Web Resources管理模型,很好的解决了image、css、script等外部资源的管理问题。现在只需要在solution explorer把资源文件的build action属性设为Embedded Resource。然后在assemblyinfo.cs里添加一句:
[assembly: WebResource("WebCtrl.cutecat.jpg""image/jpg")]
    我们可以看msdn里有WebResource的参数说明:第一个是资源的名字,第二个是资源的mime-type名。
    其实这个语句放任何cs文件里,保证放在最高级namespace外就行。

    然后在程序中调用如下:
m_Image.ImageUrl = this.Page.GetWebResourceUrl(typeof(WebCustom), "WebCtrl.cutecat.jpg");
    GetWebResourceUrl的第一个参数是用户定义的类型(这个是用来确定assembly用的),第二个参数是资源名。

    上面的语句返回给browser的代码是:
<img src="WebResource.axd?a=pWebCtrl&amp;r=WebCtrl.cutecat.jpg&amp;t=632390947985312500" style="border-width:0px;" />
    其中的src就是GetWebesourceUrl执行后返回的,它有3个参数(这里的&被解析成了&amp;,不过IIS也认的),第一个参数a是就是通过typeof(WebCustom)来确定的assembly的名字,第二个参数r很明显就是资源的名字了,第三个参数t是一个a所指的assembly的timestamp。这个t是为了让资源的引用能享用browser缓存的优化,因为IE对相同的url有自己的cache机制。又因为这个r同时又是用户assembly文件的timestamp,如果用户更新了代码,重新编译后t也会变化,这样也就保证了browser能获得最新的资源更新。如果我们能确定嵌入资源是确实不用再更新的,我们可以在typeof()里写一个bcl里的类型,比如typeof(string),那么他将只在freamwork升级后才会变动这个t。

    当然这个WebResource.axd是不存在的,它只是IIS中的一个ISAPI影射。

    使用示例代码如下:
WebResource Demo

posted on 2004-12-19 23:46 birdshome 阅读(6210) 评论(6)  编辑 收藏 网摘 所属分类: Asp.net控件开发

评论

#1楼    回复  引用    

太爽了。在1.0中老为图片路径折腾,我都快不行了
2004-12-20 09:51 | ncw [未注册用户]

#2楼    回复  引用  查看    

不错不错,呵呵
2005-09-27 10:18 | 疾风      

#3楼    回复  引用  查看    

这位朋友,我想问如下问题,谢谢
this.Page.GetWebResourceUrl
(typeof(WebCustom), "WebCtrl.cutecat.jpg");
GetWebResourceUrl的第一个参数是用户定义的类型(这个是用来确定assembly用的),第二个参数是资源名。
------------------------------------
我明白为什么第一个参数中要用typeof,它的作用是什么呢?
第二个参数是不是  “程序集名.路径名.文件名”这个顺序呀,
==============================
上面的语句返回给browser的代码是:
<img src="WebResource.axd?a=pWebCtrl&amp;r=WebCtrl.cutecat.jpg&amp;t=632390947985312500" style="border-width:0px;" /> 其中的src就是GetWebesourceUrl执行后返回的,它有3个参数(这里的&被解析成了&amp;,不过IIS也认的),第一个参数a是就是通过typeof(WebCustom)来确定的assembly的名字,第二个参数r很明显就是资源的名字了,第三个参数t是一个a所指的assembly的timestamp。这个t是为了让资源的引用能享用browser缓存的优化,因为IE对相同的url有自己的cache机制。又因为这个r同时又是用户assembly文件的timestamp,如果用户更新了代码,重新编译后t也会变化,这样也就保证了browser能获得最新的资源更新。如果我们能确定嵌入资源是确实不用再更新的,我们可以在typeof()里写一个bcl里的类型,比如typeof(string),那么他将只在freamwork升级后才会变动这个t。
---------------
因为IE对相同的url有自己的cache机制。这句话是什么意思?不太理解,谢谢
是不是首先server 会把url传过来,如果IE中判断这两个url不一样,就从server上下载图片,否则取本地缓存的。,
谢谢了

#4楼 [楼主]   回复  引用  查看    

关于asp.net2.0中内嵌资源的更多内容,还可以参看:
在自定义Server Control中捆绑JS文件 Step by Step
http://www.cnblogs.com/jackielin/archive/2005/11/29/286570.html
WebResource ASP.NET 2.0 explained
http://www.codeproject.com/aspnet/MyWebResourceProj.asp
2007-04-29 15:53 | birdshome      

#5楼    回复  引用    

为何我按这种方式,无法得到正确的图片??
2007-09-18 10:31 | hn_liubolin [未注册用户]

#6楼 [楼主]   回复  引用  查看    

@hn_liubolin
这是在ASP.NET 2.0 Beta时候做的研究,正式版似乎有小的变化,请注意。
2007-09-18 13:44 | birdshome      




标题  
姓名  
主页
Email (博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2005-08-18 22:12 编辑过
Google站内搜索
[推荐职位]上海盛大网络招聘架构师

China-pub 计算机图书网上专卖店!6.5万品种 2-8折!
近千种 9-95 新二手计算图书火热销售中!
开发者征途系统新作:《设计模式——基于C#的工程化实现及扩展》

相关文章:

相关链接: