| | | | | | | [文章信息] | | | 作者: | | | 时间: | 2003-09-26 | | 出处: | Microsoft | | 责任编辑: | 方舟 | |
| [文章导读] | | | 从程序集提供图像可以避免众多文件散布在磁盘上,简化 Web 服务器的安装和配置 | |
| |
|
| | | |
|
|
|
|
|
从自定义处理程序提供图像
如果您以前从未接触过处理程序,我将在这里大概介绍一下。处理程序是用于实现 IHttpHandler 接口的对象。当包含给定文件扩展名的请求通过 ASP.NET 管道时,将为特定动词(如 POST、GET 等)或一组动词调用处理程序。
通常,ASP.NET 会检查请求的文件扩展名,并将请求传送给与该扩展名相关联的处理程序。
了解了这些知识,我们就可以创建处理程序,将其与自己的文件扩展名相关联(这样,ASP.NET 就会知道我们要调用的是处理程序,而不是其他内容),并且以该方式提供图像。
下面的代码显示的是一个简单的处理程序,该处理程序使用了上面声明的 RenderImage 函数。
public class ManifestResourceHandler : IHttpHandler { /// <summary> /// 处理图像请求 /// </summary> /// <param name="context">The current HTTP context</param> void IHttpHandler.ProcessRequest ( System.Web.HttpContext context ) { // 从请求中获取程序集名称和资源名称 string assembly = context.Request.QueryString["assem"] ; string image = context.Request .QueryString["image"] ;
// 然后加载图像并返回给调用方 ManifestImageLoader.RenderImage ( assembly , image ) ; }
/// <summary> /// 此处理程序可以重复使用,不需要循环 /// </summary> bool IHttpHandler.IsReusable { get { return true; } } } | 这段代码与上面为 ASPX 页面显示的代码非常类似 - 从传来的 URL 读取参数,然后将这些参数传递到 RenderImage 函数。
现在,要想使用处理程序来提供图像,我们需要使用不同的 URL。在此实例中,需要创建一个虚构的文件扩展名(即在 IIS 中不存在的扩展名),这样,图像请求就可以传送给正确的处理程序。在此示例中我将使用扩展名“mfr”(表示“清单资源”)。图像请求现在看起来有点像下面的描述。
| <img src=".mfr?assem=MS.Resources&image=winxp.gif" /> | 注意,我还未指定资源的路径,只是指定了文件扩展名 .mfr。
使用处理程序的主要好处是可以为所有请求调用该程序,而不用考虑它们的路径。
要使处理程序能够工作还需要另外两个步骤。首先,需要修改 web.config,以指定新的处理程序:
<configuration> <system.web> ... <httpHandlers> <add verb="GET" path="*.mfr" type="ImageServer.ManifestResourceHandler, ImageServer" /> </httpHandlers> </system.web> </configuration> |
上述配置文件中的类型定义了实现处理程序的类型和程序集。注意,动词属性区分大小写,因此应设置为 GET 而不是其他的大小写形式。程序集本身需要驻留在您 Web 站点的二进制目录中,或安装在全局程序集缓存 (GAC) 中。
其次,您需要在 IIS 管理中编辑 Web 服务器的配置。单击您要更改的 Web 站点的 Properties(属性),选择 Home Directory(主目录)选项卡,然后单击 Configuration(配置)。将显示与以下窗口类似的窗口。
 图 1:配置 IIS
单击 Add(添加)按钮,为 .mfr 文件类型创建条目。每个扩展名都会被映射到处理资源请求的 ISAPI 过滤器。对于 ASP.NET,为 aspnet_isapi.dll 过滤器。此库驻留在磁盘中已安装的 Framework 下,因此要设置 .mfr 扩展名的所有请求以通过相应的 ISAPI dll,需要进行如下设置:
版本 路径 1.0 C:\WINDOWS\Microsoft.NET\Framework\v1.0.3705\aspnet_isapi.dll 1.1 C:\WINDOWS\Microsoft.NET\Framework\v1.1.4322\aspnet_isapi.dll
其余的设置显示在以下图像中。请注意,必须清除 Verify that file exists(检查文件是否存在)复选框,否则永远不会调用处理程序(因为磁盘中不存在实际的 .mfr 文件)。
 图 2:为扩展名设置属性
现在应该可以运行处理程序了。在浏览器中键入映射到程序集中的资源的 URL:
 图 3:从程序集提供图像
如果您接收到的不是请求的图像,而是一个异常(如“‘null’不是‘stream’的有效值”),那么您可能遇到了目前我们还没有在代码中进行处理的一些小问题 - 如果图像有错误怎么办? 我们将在下一节对这个问题及其他一些小问题进行纠正。
|
|
|
|
|
|
|
|