目录:
增强代码
整理
性
小结
关于作者
增强代码
代码中首先要处理的是大小写形式。HTTP 认为以下所有 URL 都相同,因为 URL 不区分大小写
<img src="/uploadfile/201210/13/1A02618690.gif" /> <img src="/uploadfile/201210/13/1A02618690.gif" /> <img src="/uploadfile/201210/13/1A02618690.gif" /> |
不区分大小写
我们要做的是从程序集加载图像而不考虑大小写,但由于 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 ) ; } |
然后,我就可以使用 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 ; // 将图像写入响应流 |
关于异常的编程
我们的代码中可能会引发很多异常。现在,用户的浏览器可能会断开链接,甚