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

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

  提供图像

  既然问题的关键是要提供图像,那么我们现在就进入正题。当从调用方传来信息后,我们需要找到一种方法来加载图像并在响应流中返回图像。请注意,此示例中提供的图像只有 .gif 一种类型 - 要提供其他类型的图像,则需要通过图像扩展名来推断内容类型和图像格式。

  以下函数显示如何从给定的程序集加载图像,并通过 HttpResponse 流返回给客户端。我们将把此函数作为后面代码的基础,并在接下来的内容中添加更有用的功能,例如异常处理和图像缓存。我将把此函数定义为 ManifestImageLoader 类中的静态函数。

public class ManifestImageLoader
{
public static void RenderImage ( string assembly , string image , HttpContext context )
{
Assembly resourceAssem = Assembly.Load ( assembly ) ;

// 获取资源
using ( Stream imageStream = resourceAssem.GetManifestResourceStream ( image ) )
{
// 如果可以,将其写出
using ( System.Drawing.Image theImage =
System.Drawing.Image.FromStream ( imageStream ) )
response.ContentType = "image/gif" ;
theImage.Save ( context.Response.OutputStream , ImageFormat.Gif ) ;
}
}
}

  函数 RenderImage 接受程序集名称、图像名称和响应流。有了有效的程序集名称和图像名称,加载图像并将其返回到输出流就轻而易举了。首先加载程序集,然后使用 Assembly.GetManifestResourceStream 函数返回已命名资源(在此实例中为图像)的数据流。您需要为 System.Reflection 和 System.IO 添加 using 子句,使其能够通过编译,并引用 System.Drawing 程序集。

  有了图像数据流之后,可以使用 Image.FromStream() 方法从该字节流构造图像 - 请注意,我们使用的是 System.Drawing 中的图像类,而不是 System.Web.UI.WebControls 中具有类似名称的类,因为前者具有访问 Win32 图像函数的权限,而后者在 Web 控件中包含了 <img> 标记。

  您或许不熟悉 C# using 语法,该语法在 Try/Finally 块中包含了代码,可以确保对括号中的项调用 Dispose。

  现在我们可以从程序集提供图像了,首先需要能够为该图像创建 URL。第一种方法是使用 .ASPX 页面。

  从 ASPX 页面提供图像

  第一种提供图像的方法需要使用 .ASPX 页面,该页面通常要驻留在服务器上的某个位置。页面本身不包含内容 - 它的主要功能是从 URL 检索参数,并使用这些参数来检索图像。

  例如,有一个名为 ImageFromASPX.aspx 的页面位于 Web 站点的根目录下。然后可以在 HTML 中使用以下 URL 编码语法来定义从此页面提供的所有图像。这里我们提供的是名为 winxp.gif 的标题图像。

<img src="/imagefromASPX.aspx?assem=ImageServer&image=winxp.gif" />

  在 URL 中,我们定义了 ASPX 页面的路径,然后定义了两个参数,一个是程序集名称(在此实例中为 ImageServer),另一个是图像名称。这在安全性方面可能存在风险,因此在本文的后面我将介绍一种可用于此数据的加密方法。
 
  在 ASPX 页面的代码中,可以写入以下内容:

private void Page_Load ( object sender, System.EventArgs e )
{
// 检索参数
string assembly = Request.QueryString["assem"] ;
string image = Request.QueryString["image"] ;

// 并加载图像
ManifestImageLoader.RenderImage ( assembly , image ) ;
}

  代码所做的就是根据请求分析参数,然后调用我们前面编写的 RenderImage 函数。正如您看到的,这并不难实现。但它有一个缺点,即所有对图像的请求都需要通过同一个 URL。也就是说,每个自定义控件都必须知道 imageserver.aspx 文件的位置和名称,才能提供图像。如何避免这个限制是下一节的主题。


上一页  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