asp.net运行原理,笔记

asp.net运行原理,笔记中的笔记

当你请求一个包含ASP.NET应用的网址时,IIS接受到请求(IIS是WEB服务守候进程),IIS收到请求后,会根据请求

者请求的主机头或者IP或者端口号来找到对应的站点.

IIS
当找到站点后,如果你请求的资源是以ASPX为结尾的WEBFORM,时,IIS会将控制权交给一个ISAPI扩展.,名叫

AspNet_ISAIP.DLL.这时,控制权由IIS交到ASPNET的ISAPI扩展上

ISAPI

能够处理各种后缀名的应用程序,通常被称为 ISAPI 应用程序(NOTE:Internet Server Application Programe Interface,互联网服务器应用程序接口)。虽然这 ISAPI 听上去还挺气派,也算是“应用程序”呢,但仔细看看它的全称就明白了:它实际上只是一个接口,起到一个代理的作用,它的主要工作是映射所请求的页面(文件)  和与此后缀名相对应的实际的处理程序。


ISAPI收到处理请求后,会启动一个ASP.NET工作进程.然后将请求者的请求信息转交给ASP.NET工作进程(名为

ASPNET_WP.EXE).接下来,控制权由ASPNET_WP掌握

ASPNET_WP.EXE,APPDOMAIN
ASPNET_WP首先解出请求者的信息,如果请求者请求的ASP.NET应用程序(站点或虚拟目录,通俗一点)尚未拥有

APPDOMAIN,ASPNET_WP就会建立一个APPDOMAIN,并且将被请求的ASP.NET应用所需的Assembly(就是那些DLL,例如

System.Web.DLL等)载入到APPDOMAIN中


当APPDOMAIN初始化完成后,接下来就需要建立会话了吧,因此,请求由HttpRuntime来接受,HttpRunTime主要的工

作便是为每一个提出请求的客户建立一个HttpContext对象.这个东东又管理着HttpSession对象.每一个访问者

有各自的HttpContext对象和HttpSession对象


HttpRuntime负责创建HttpContext和HttpSession,httpContext负责管理httpSession

到HttpRuntime创建完httpContext为止,实际上,你的应用程序仍然没有运行,或者说,请求者的请求实际上并未

真正的被处理,前面的工作都是些准备性或者辅助性的工作.HttpRuntime除了创建上面的对象外,还要创建

HttpApplication.至于创建Application对象的过程,是比较复杂的

接下来,HttpApplication调用ProcessRequest方法来处理用户请求,此方法会调用对应的HttpHandler来处理用户请求,HttpHandler根据用户请求的文件的扩展名处理请求,并把请求的结果,也就是HTML发送到客户浏览器

 

 

 

利用Http Handler实现防止盗链

这2天在看asp.net运行原理

ISAPI,它根据文件名后缀把不同的请求转交给不同的处理程序。但是仔细看看就会发现:几乎一大半的文件都交给 aspnet_isapi.dll 去处理了。很明显,aspnet_isapi.dll 不可能对每种文件采用同一种方式处理,那么 aspnet_isapi.dll 是如何更进一步处理不同的文件,交由谁去处理呢?

为了搞清楚这个问题,我们需要打开机器上C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\CONFIG\ 目录下的web.config 文件。

可以看到,在<httpHandlers>结点中将不同的文件类型映射给不同的Handler去处理,对于.aspx来说,是由System.Web.UI.PageHandlerFactory来处理。而对于.cs来说,是由System.Web.HttpForbiddenHandler 处理.

如果我们要用编程的方式来操控一个Http请求,我们就需要实现IHttpHandler接口,来定制我们自己的需求。

IHttpHandler要求实现一个方法和一个属性

下面就是利用实现IHttpHandler来完成防止盗链.

 


  public class JpgHandler : IHttpHandler
    {
        
public void ProcessRequest(HttpContext context)
        {
            
// 获取文件服务器端物理路径
            string FileName = context.Server.MapPath(context.Request.FilePath);
            
// 如果UrlReferrer为空,则显示一张默认的禁止盗链的图片
            if (context.Request.UrlReferrer.Host == null)
            {
                context.Response.ContentType 
= "image/JPEG";
                context.Response.WriteFile(
"~/error.jpg");
            }
            
else
            {
                
// 如果 UrlReferrer中不包含自己站点主机域名,则显示一张默认的禁止盗链的图片
                if (context.Request.UrlReferrer.Host.IndexOf("localhost"> -1)
                {
                    context.Response.ContentType 
= "image/JPEG";
                    context.Response.WriteFile(FileName);
                }
                
else
                {
                    context.Response.ContentType 
= "image/JPEG";
                    context.Response.WriteFile(
"~/error.jpg");
                }
            }
        }
        
public bool IsReusable
        {
            
get { return true; }
        }
    }

 

接着还需要配置webconfig

 

<httpHandlers>
<add verb="*" path="*.jpg" type="WebApplication9.JpgHandler,WebApplication9"/>

 

path指的是请求的文件名称,可以使用通配符扩大范围,也可以明确指定这个handler仅用于处理某个特定的文件(比如说:filename.aspx)的请求。verb指的是请求此文件的方式,可以是post或get,用*代表所有访问方式。type属性由“,”分隔成两部分,第一部分是实现了接口的类名,第二部分是位于Bin目录下的编译过的程序集名称。

最后还需要去IIS配置jpg的映射,之后就完成了.

 

posted @ 2009-12-15 08:46  tangself  阅读(497)  评论(0编辑  收藏  举报