资源描述
HTTP管道技术目标:1. 了解ASP.NET生命周期2. 了解HTTP运行时3. 了解HTTP管道技术4. 掌握HttpHandler和HttpModule一. 了解ASP.NET生命周期多个用户相关处理资源(1)(IIS)WEB服务器(inetinfo.exe)只有少数几种被客户端请求的资源类型由IIS直接处理,如对HTML页面,文本文件,jped和gif图像的传入请求对ASP.NET资源(*.aspx)的请求将传递到ASP.NET ISAPI扩展,该系统组件是一个名为aspnet_isapi.dll的win32DLL(2)aspnet_isapi.dll:可以处理多种资源类型,包括web服务和HTTP处理程序调用(3)ASP.NET 辅助进程 (aspnet_wp.exe)由aspnet_isapi.dll负责调用Aspnet_wp.exe负责控制请求的执行,并可以终止请求t二. 认识)aspnet_isapi.dll三. ISAPI和辅助进程的关系ISAPI和辅助进程之间的通讯时使用一组命名管道进行的命名管道是一种win32机制,用于跨进程边界传输数据.顾名思义,命名管道的工作方式与管道相似:在一端输入数据.另一端输出相同的数据,建立的管道既可以连接本地进程,也可以连接远程计算机上运行的进程,对于本地进程间通讯,管道是windows中最有效,最灵活的工具四. ASP.NET请求的处理逻辑步骤1. 当请求到达时,IIS检查资源类型并调用ASP.NET ISAPI扩展,如果启用了默认的进程模型,ASPNET_ISPI会将请求排队,并将请求分配给辅助进程,所有的请求数据都通过异步I/0发送.2. 收到请求后,ASP.NET辅助进程将通知ASP.NET ISAPI,它将为请求服务(建立管道)3. 在辅助进程的上下文中执行请求.有时,辅助进程可能需要回调ISAPI以完成请求,也就是需要说枚举服务器变量,这种情况下,辅助进程将使用同步管道,因为这样可以保持请求处理逻辑的顺序.4. 完成后,响应被发送到打开了异步管道的aspnet_isapi.如果aspnet_isapi检测到辅助进程已取消,它将自动终止请求并释放所有相关的IIS资源五. ASP.NET运行时环境构成ASP.NET运行时环境的可执行文件Aspnet_filter.dll组件是一个小的win32 ISAPI筛选器,用来备份ASP.NET应用程序的无cookie会话状态Aspnet_state.exe的作用对web应用程序更为重要,因为它用于管理会话状态六. HTTP管道HTTP管道代表的是ASP.NET应用程序的生命周期.在ASP.NET应用程序中,系统使用一组相关的类,通过一定的循序来处理客户端的请求(request),ASP.NET应用程序的处理模式,可称之为HTTP处理管道httpModule和httpHandler就是这个处理管道上的两个处理环节相关类:HttpWorkerRequest抽象类定义了ASP.NET页面处理器尼姑的基本方法HttpRuntime 提供了处理应用的一组服务HttpContenxt保存了处理一次请求的所有相关上下文信息HttpApplicationFactory提供相关目录的应用程序HttpApplication定义了所有ASP.NET应用程序的通用方法,属性和事件.这个类也是在用户在global.sax文件中定义的应用基类Modules处理请求前和响应后的事件HandlerFactories提供应用程序中的HandlersHandlers处理请求和响应七. HttpHandler1 HttpHandler:处理请求(request)的信息和发送响应(Response)2 System.Web.UI.Page类-也实现了HttpHandler的接口3 可以通过HttpHandler拦截请求,执行我们自定义处理程序4 Web.config中节点配置 节点详细说明: verb可以是GET或POST,表示对GET或POST的请求进行处理。*表示对所有请求进行处理,这里是对GET请求进行处理。 path指明对相应的文件进行处理,*.aspx表示对发给所有ASPX页面的请求进行处理,这里单独对redirect.aspx页面进行处理。可以指明路径,如blogs。表明只对blogs目录下的redirect.aspx文件请求进行处理。 type属性中,逗号前的字符串指明HttpHandler的实现类的类名,后面的字符串指明Dll文件的名称。相关应用1.防盗链接public class FileDownHandler : IHttpHandler bool IHttpHandler.IsReusable get return true; public void ProcessRequest(HttpContext context) if (context.Request.UrlReferrer = null) | (context.Request.UrlReferrer.Host = localhost & context.Request.UrlReferrer.Port = 80) context.Response.Expires = 0; context.Response.Clear(); context.Response.ContentType = rar; context.Response.WriteFile(context.Request.PhysicalPath); context.Response.End(); else /如果不是本地引用,则属于盗链引用, HttpResponse response = context.Response; response.Redirect(context.Request.ApplicationPath + /ErrorPage.htm); 2. 给图片打上水印public class CoverHandler:IHttpHandler private const string WaterImage_Url = /Images/WaterMark.jpg; private const string DefaultImage_Url = /Images/default.jpg; bool IHttpHandler.IsReusable get return false; void IHttpHandler.ProcessRequest(HttpContext context) System.Drawing.Image img=null; if (File.Exists(context.Request.PhysicalPath) img = Image.FromFile(context.Request.PhysicalPath); Image waterimage = Image.FromFile(context.Request.MapPath(WaterImage_Url); Graphics g = Graphics.FromImage(img); g.DrawImage(waterimage, new Rectangle(img.Width - waterimage.Width, img.Height - waterimage.Height, waterimage.Width, waterimage.Height), 0, 0, waterimage.Width, waterimage.Height, GraphicsUnit.Pixel); g.Dispose(); waterimage.Dispose(); else img = Image.FromFile(context.Request.MapPath(DefaultImage_Url); context.Response.ContentType = image/jpeg; img.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg); img.Dispose(); context.Response.End(); 添加半透明的水印ImageAttributes attributes = new ImageAttributes(); float alpha = 60 / 255.0f; float colorMatrixElements = new float 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, new float 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, new float 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, new float 0.0f, 0.0f, 0.0f, alpha, 0.0f, new float 0.0f, 0.0f, 0.0f, 0.0f, 1.0f; ColorMatrix colorMatrix = new ColorMatrix(colorMatrixElements); /设置颜色调整矩阵 attributes.SetColorMatrix(colorMatrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap); g.DrawImage(waterimage, new Rectangle(img.Width - waterimage.Width, img.Height - waterimage.Height, waterimage.Width, waterimage.Height), 0, 0, waterimage.Width, waterimage.Height, GraphicsUnit.Pixel,attributes); g.Dispose();/释放内存 waterimage.Dispose();3. 伪Url地址的实现public bool IsReusable get return true; public void ProcessRequest(HttpContext context) HttpResponse res = context.Response; HttpRequest req = context.Request; if(req.FilePath.EndsWith(tht) res.Write(我是一个兵); 复杂的伪URL实现?八. HttpModel
展开阅读全文