内嵌图片于dll中
1、新建一个类库,并将一张图片复制到工程中。
例子中,我们使用了我的文档中图片收藏的一张图片,命名为LOTUS.jpg
在解决方案资源管理器中,右击图片,选择属性,在属性面板中,我们将图片的生成操作属性改为嵌入的资源。
2,生成该程序集
引用类库,新建HTTP处理程序
1、我们在ASP.net工程中,添加引用,引用刚刚生成的dll程序集。
2、新建一个ASP.net HTTP处理程序,命名为Images.ashx,编写如下代码
<%@ WebHandler Language="VB" Class="images" %>
Imports System
Imports System.Web
Imports System.Reflection
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Public Class images : Implements IHttpHandler
Public Sub ProcessRequest(ByVal context As HttpContext) Implements IHttpHandler.ProcessRequest
Dim dll As Assembly = Assembly.Load("ResuourceDemo")
Dim jpg As Bitmap = New Bitmap(dll.GetManifestResourceStream("ResuourceDemo.LOTUS.jpg"))
context.Response.Clear()
context.Response.ContentType = "image/jpeg"
Using ms As MemoryStream = New MemoryStream
jpg.Save(ms, ImageFormat.Jpeg)
ms.Flush()
context.Response.BinaryWrite(ms.GetBuffer)
End Using
jpg.Dispose()
End Sub
Public ReadOnly Property IsReusable() As Boolean Implements IHttpHandler.IsReusable
Get
Return False
End Get
End Property
End Class
在ASP.net中,资源的名称是根据如下的约定确定的:Namespace.FIleName.Extension,标记对应于程序集默认的命名空间,而FileName和Extension标记对于被嵌入的文件名称和扩展名。对于例子中的图片,完整的名称就是ResuourceDemo.LOTUS.jpg。
而在此之前,为了读取dll中的资源,我们必须使用System.Refiection命名空间中的Assembly类的两个方法,分别是GetMainfestResourceNames和GetManifestResourceStream。前者返回一个字符串数组,其中的每个元素代表一个被包含的资源名称(本例未用此方法),后者取这些资源名称之一为参数,并获取相应的嵌入资源流
Dim dll As Assembly = Assembly.Load("ResuourceDemo")
Dim jpg As Bitmap = New Bitmap(dll.GetManifestResourceStream("ResuourceDemo.LOTUS.jpg"))
如上所示,在程序中的,我们使用Assembly类的Load方法,加载程序集ResuourceDemo.dll,再使用该类的GetManifestResourceStream方法引入程序集中图片的完整名称ResuourceDemo.LOTUS.jpg为参数,将程序集中的资源读取到Bitmap对象中。
新建一个内存流,将图片对象读取到内存中,最后输出到客户端中。完成了图片的输出。
测试ASP.net HTTP处理程序
1、新建一个ASP.net窗体。添加Image控件,将设置Image控件的ImageUrl属性为Image.ashx
运行窗体
后记,带ashx扩展名的资源,由一个名为SimpleHandleFactory的HTTP处理程序类进行处理。我们应该利用HTTP处理程序资源来实现应用程序的特有功能。它们需要比常规的Web页面被更快地处理。在任何情况下,HTTP处理程序返回一个带有内容类型和主体有效的HTTP响应。
在JSP中,有过滤器的概念,可以过滤任何HTTP的请求,这里的.NET HTTP处理程序与之同理,更加有效的、典型的应用就是保护服务器上的资源不被非法盗链。这是一个非常实用的功能。