HttpHandler HttpModule 做出属于自己的后缀的网页 !
Posted on 2007-03-20 14:23 自適應軟件...... 阅读(5640) 评论(38) 编辑 收藏 举报
我们用Asp.Net做出来的Web通常是.Aspx后缀的.但是,你希望能有其它属于自己的后缀吗?我们一起来研究研究!
首先谈谈ASP.net的一些参数传递和页面定向的方式
第一,ASP.net是用Page.Navigate()调用新页面的URL。Page.Navigate()向浏览器返回了一个http状态码302,使得浏览器向server请求那个新的URL。这种导航方法导致每次客户请求都需两次在client和server之间往返。
第二,任何要传递到新页面的信息都需作为URL的参数或存储在Session中或存储在数据库中以便新页面得到这些信息。传统的ASP开发人员很习惯这种做法,但其他的web编程人员则有一些更高级的方法。但是很明显的这两个页面是有依赖性的,而依赖性是编译器捕捉不到的也是不容易在设计阶段建模的。所以在debug时,参数是否被正确的传递就只有我们自己检查了。再有传统的数据传递方式有可能会暴露一些关键的数据。更为关键的是这使得面向对象的设计变得很复杂。
但是我们可以自定义httphandler来扩充这种支持。
要对HTTPMODULE和IHTTPHANDLER进行研究,必须先对ASP.NET的处理管道有一个了解。
在ASP.NET应用程序中,系统使用一组相关的类,通过一定的顺序来处理客户端的请求(REQUEST),ASP.NET应用程序的处理模式可称之为HTTP处理管道。
HTTPMODULE和IHTTPHANDLER就是这个处理管道上的两个处理环节。 HTTP处理管道中的类在SYSTEM.WEB名称空间中定义,主要有以下类型: HTTPWORKERREQUEST 抽象类定义了ASP.NET页面处理请求的基本方法;
HTTPRutime 提供了处理应用的一组服务;
HTTPContext 保存了处理一次请求的所有相关上下文信息;
HTTPApplicationFactory 提供相关目录的应用程序;
HTTPApplication 定义了所有ASP.NET应用程序的通用的方法、属性和事件。这个类也是在用户在GLOBAL.ASAX文件中定义的应用的基类;
Modules 处理请求前和响应后的事件;
Handlerfactories 提供应用程序中的HANDLERS;
Handlers 处理请求和响应。
在WINDOWS平台上,HTTP PIPLINE需要IIS的支持。为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE ASPNET_ISAPI.DLL是一个ISAPI EXTENTION他将发向IIS的请转交ASPNET_WP.EXE处理 ASPNET_WP.EXE使用HTTPRUNTIME对请求进行具体处理 处理的过程可以用图表示如下:
下面一个简单的例子来理解! 1). 建立一个名为SimpleHandler的工程,添加一个类MyHandler.cs,代码如下:
2). 将上面的代码编译,生成SimpleHandler.dll 文件;
3). 建立一个新的Web项目,将文件SimpleHandler.dll 添加到项目的引用中;
4). 修改Web.config ,添加如下内容:
<system.web>
<httpHandlers>
<add verb="*" path="*.ASPX" type="SimpleHandler.MyHandler,SimpleHandler" />
</httpHandlers>
</system.web>
配置文件中的选项说明:
VERB可以是"GET"或"POST",表示对GET或POST的请求进行处理。
"*"表示对所有请求进行处理。
PATH指明对相应的文件进行处理,"*.ASPX"表示对发给所有ASPX页面的请求进行处理。可以指明路径,如"/TEST/*.ASPX",表明只对TEST目录下的ASPX文件进行处理。
TYPE属性中,逗号前的字符串指明HTTPHANDLER的实现类的类名,后面的字符串指明DLL文件的名称。
现在,请求项目中的任何ASPX页面,页面上显示的始终只有如下一行字: My first Handler !
因为,我们自定义的HANDLER截获了所有发向ASPX页面的请求,并且用自己的的方法来处理这些请求了。
为了使我们的字定义页面 如: *.AAA 能够顺利运行,我们需要修改WEB.CONFIG文件:
<system.web>
<httpHandlers>
<add verb="*" path="*.AAA" type="SimpleHandler.MyHandler,SimpleHandler" />
</httpHandlers>
</system.web>
为了让对后缀名为.AAA 的文件的请求能够被我们的HANDLER截获运行,我们还需要一些额外的工作。打开IIS的管理控制台,又键单击站点,选择"属性",跳出站点的属性对话框。选择主目录选项,选择配置,弹出应用程序配置对话框,将".AAA"添加到应用程序映射中 . 好了,我们现在可以在项目中添加一个.AAA 文件,当向该文件发送请求时,浏览器显示: My first Handler ! 而对其他ASPX文件的访问不受影响。
首先谈谈ASP.net的一些参数传递和页面定向的方式
第一,ASP.net是用Page.Navigate()调用新页面的URL。Page.Navigate()向浏览器返回了一个http状态码302,使得浏览器向server请求那个新的URL。这种导航方法导致每次客户请求都需两次在client和server之间往返。
第二,任何要传递到新页面的信息都需作为URL的参数或存储在Session中或存储在数据库中以便新页面得到这些信息。传统的ASP开发人员很习惯这种做法,但其他的web编程人员则有一些更高级的方法。但是很明显的这两个页面是有依赖性的,而依赖性是编译器捕捉不到的也是不容易在设计阶段建模的。所以在debug时,参数是否被正确的传递就只有我们自己检查了。再有传统的数据传递方式有可能会暴露一些关键的数据。更为关键的是这使得面向对象的设计变得很复杂。
但是我们可以自定义httphandler来扩充这种支持。
要对HTTPMODULE和IHTTPHANDLER进行研究,必须先对ASP.NET的处理管道有一个了解。
在ASP.NET应用程序中,系统使用一组相关的类,通过一定的顺序来处理客户端的请求(REQUEST),ASP.NET应用程序的处理模式可称之为HTTP处理管道。
HTTPMODULE和IHTTPHANDLER就是这个处理管道上的两个处理环节。 HTTP处理管道中的类在SYSTEM.WEB名称空间中定义,主要有以下类型: HTTPWORKERREQUEST 抽象类定义了ASP.NET页面处理请求的基本方法;
HTTPRutime 提供了处理应用的一组服务;
HTTPContext 保存了处理一次请求的所有相关上下文信息;
HTTPApplicationFactory 提供相关目录的应用程序;
HTTPApplication 定义了所有ASP.NET应用程序的通用的方法、属性和事件。这个类也是在用户在GLOBAL.ASAX文件中定义的应用的基类;
Modules 处理请求前和响应后的事件;
Handlerfactories 提供应用程序中的HANDLERS;
Handlers 处理请求和响应。
在WINDOWS平台上,HTTP PIPLINE需要IIS的支持。为了运行ASP.NET应用,IIS需要以下两个文件:ASPNET_ISAPI.DLL和ASPNET_WP.EXE ASPNET_ISAPI.DLL是一个ISAPI EXTENTION他将发向IIS的请转交ASPNET_WP.EXE处理 ASPNET_WP.EXE使用HTTPRUNTIME对请求进行具体处理 处理的过程可以用图表示如下:
下面一个简单的例子来理解!
namespace SimpleHandler
{
public class MyHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
HttpResponse response = ctx.Response;
response.Write(" My first Handler !");
}
public bool IsReusable
{
get { return true; }
}
}
}
{
public class MyHandler : IHttpHandler
{
public void ProcessRequest(HttpContext ctx)
{
HttpResponse response = ctx.Response;
response.Write(" My first Handler !");
}
public bool IsReusable
{
get { return true; }
}
}
}
2). 将上面的代码编译,生成SimpleHandler.dll 文件;
3). 建立一个新的Web项目,将文件SimpleHandler.dll 添加到项目的引用中;
4). 修改Web.config ,添加如下内容:
<system.web>
<httpHandlers>
<add verb="*" path="*.ASPX" type="SimpleHandler.MyHandler,SimpleHandler" />
</httpHandlers>
</system.web>
配置文件中的选项说明:
VERB可以是"GET"或"POST",表示对GET或POST的请求进行处理。
"*"表示对所有请求进行处理。
PATH指明对相应的文件进行处理,"*.ASPX"表示对发给所有ASPX页面的请求进行处理。可以指明路径,如"/TEST/*.ASPX",表明只对TEST目录下的ASPX文件进行处理。
TYPE属性中,逗号前的字符串指明HTTPHANDLER的实现类的类名,后面的字符串指明DLL文件的名称。
现在,请求项目中的任何ASPX页面,页面上显示的始终只有如下一行字: My first Handler !
因为,我们自定义的HANDLER截获了所有发向ASPX页面的请求,并且用自己的的方法来处理这些请求了。
为了使我们的字定义页面 如: *.AAA 能够顺利运行,我们需要修改WEB.CONFIG文件:
<system.web>
<httpHandlers>
<add verb="*" path="*.AAA" type="SimpleHandler.MyHandler,SimpleHandler" />
</httpHandlers>
</system.web>
为了让对后缀名为.AAA 的文件的请求能够被我们的HANDLER截获运行,我们还需要一些额外的工作。打开IIS的管理控制台,又键单击站点,选择"属性",跳出站点的属性对话框。选择主目录选项,选择配置,弹出应用程序配置对话框,将".AAA"添加到应用程序映射中 . 好了,我们现在可以在项目中添加一个.AAA 文件,当向该文件发送请求时,浏览器显示: My first Handler ! 而对其他ASPX文件的访问不受影响。