您的位置:软件 > 开发者网络 > 微软开发专栏 > 技术专题 > 正文
从 .NET 程序集提供图像
[文章信息]
作者:
时间:2003-09-26
出处:Microsoft
责任编辑:方舟
[文章导读]
从程序集提供图像可以避免众多文件散布在磁盘上,简化 Web 服务器的安装和配置
advertisement
热点推荐
· 天极网软件频道改版调查
· 10.29软件精选 精简注册表
· 加速启动Win XP操作系统的谬论
· 如何提高Linux操作系统速度
· 精简注册表高级用法——安全篇
[正文]

上一页  1 2 3 4 5 6  下一页

  增强代码

  代码中首先要处理的是大小写形式。HTTP 认为以下所有 URL 都相同,因为 URL 不区分大小写。

<img src=".mfr?assem=ImageServer&image=winxp.gif" />
<img src=".mfr?assem=ImageServer&image=WINxp.gif" />
<img src=".mfr?assem=ImageServer&image=WiNxP.gif" />

  我们的代码目前有一个问题,由于它不保留原 HTTP 请求不区分大小写的特征,因此必须向 LoadAndReturnImage 函数再添加一些代码。

  不区分大小写

  我们要做的是从程序集加载图像而不考虑大小写,但由于 Assembly.GetManifestResourceStream 是区分大小写的,因此还得另想办法。Assembly.GetManifestResourceNames() 函数将返回给定程序集内的所有资源列表,因此我们要做的就是调用此列表,与这些资源名称进行不区分大小写的比较,然后使用查找出的名称:

Assembly resourceAssem = Assembly.Load ( assembly ) ;

// 查找缓存的名称
string[] names = HttpContext.Current.Application [ assembly ] as string[] ;

if ( null == names )
{
// 获取程序集内所有资源的名称
names = resourceAssem.GetManifestResourceNames() ;
Array.Sort ( names , CaseInsensitiveComparer.Default ) ;
HttpContext.Current.Application [ assembly ] = names ;
}

// 如果此程序集内存在一些资源,
// 检查所需的资源
if ( names.Length > 0 )
{
// 在名称数组中查找图像
int pos = Array.BinarySearch ( names , image ,
CaseInsensitiveComparer.Default ) ;

if ( pos > -1 )
WriteImage ( resourceAssem , names[pos] , true ) ;
}

  这里我加载了包含资源的程序集,然后查找应用程序缓存以查看该程序集内的资源列表是否已被加载和缓存。如果没有,我通过调用 Assembly.GetManifestResourceNames() 来读取资源列表,然后对列表进行排序,并将其存储在应用程序状态中。

  然后,我就可以使用 Array.BinarySearch() 方法对名称列表执行二进制搜索。这比按顺序搜索字符串列表要快得多,且在应用程序状态存储资源列表所需的系统开销也较小。

  这样就解决了区分大小写的问题,但性能如何呢?目前,每次当图像请求到达时,我们都要调用全部代码 - 除了最小的 Web 站点之外,其余所有的请求都可能会造成严重的性能问题。下一节我们将处理这个问题。

  缓存

  像普通的图像和一些 ASPX 页面一样,把从程序集返回的图像进行缓存是很有用的 - 因为这些图像驻留在程序集中,一般不会频繁地更改。

  如果我们在编写一个简单的 ASPX 页面,则可以添加 OutputCache 指令以缓存页面。但在我们的方案中,我们需要一种方法能够通过编程方式将缓存控件标题添加到响应流中。幸运的是,在 ASP.NET 中这很容易完成。在把图像写入输出流的函数中,只需添加以下几行:

response.Cache.SetExpires ( DateTime.Now.AddMinutes ( 60 ) ) ;
response.Cache.SetCacheability ( HttpCacheability.Public ) ;
response.Cache.VaryByParams["assem"] = true ;
response.Cache.VaryByParams["image"] = true ;
// 将图像写入响应流...

  此设置使图像在一小时(这个时间显然可以延长以减少服务器负载)后过期,并定义图像可以在任意位置(客户端、代理服务器、服务器等)进行缓存。它还定义了更改缓存行为的参数。

  现在,代码几乎已经完成了,但我们需要决定如何处理异常情况。


上一页  1 2 3 4 5 6  下一页

·"WAP天极之IT新闻资讯,50万元等你拿"    ·天极WAP之游戏狂图,50万元等你下载


发表评论推荐给朋友我想参加相关培训打印我对此感兴趣订阅电子杂志
相关内容阅读排行榜
  • VS.NET中构建数据库应用程序
  • .NET后台智能传输服务实现自动更新(上)
  • 探秘Visual Studio.Net 2003
  • 解析.NET框架下的数据类型转化技术
  • 主板超频特色技术ASUS华硕篇
  • 十大年底网游期待大作
  • 竞技游戏美女汉堡MM访谈
  • ATI显卡驱动下载回顾专题
  • 裸露的飞天舞 完全裸机酷图
  • CIG 2004:重庆赛区地点更改通知
  • 10.29软件精选 精简注册表
  • 且看江湖谁主沉浮 金庸群侠魔兽版
  • Advertisement