posts - 44, comments - 268, trackbacks - 22, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理
我们用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,代码如下:

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; }
        }
    }
}

 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",表示对GETPOST的请求进行处理。
   
"*"表示对所有请求进行处理。 
   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文件的访问不受影响。






Feedback

#1楼    回复  引用    

2007-03-20 14:39 by 幻想曲 [未注册用户]
仅仅改web.config就够了么??
IIS不需要做处理么?

#2楼 [楼主]   回复  引用  查看    

2007-03-20 14:56 by 自適應軟件......      
@by 幻想曲
謝謝妳 , 我Post隨筆的時候,掉了一段!

如果,在IIS中沒有註冊的後綴!就需要在IIS中註冊!

#3楼    回复  引用  查看    

2007-03-20 15:00 by Clingingboy      
这个用在虚拟主机上不适合

#4楼    回复  引用  查看    

2007-03-20 15:04 by slightboy      
还以为不需要改 IIS 就可以... -_-

#5楼 [楼主]   回复  引用  查看    

2007-03-20 15:11 by 自適應軟件......      
@Clingingboy
講講你的理由?

#6楼    回复  引用  查看    

2007-03-20 15:26 by 亚历山大同志      
注册个多奇怪的后缀完全没意思,aspx就行了,何必呢

#7楼    回复  引用    

2007-03-20 15:43 by 幻想曲 [未注册用户]
@自適應軟件......
虚拟主机上你是没有权限去在iis中注册*.aaa的
除非你是整机租用

#8楼 [楼主]   回复  引用  查看    

2007-03-20 15:44 by 自適應軟件......      
@亚历山大同志
只是用來理解HttpHandler機制!

再說,是在在Web Server上註冊,客戶端訪問的時候,沒有影響.有必要的時候才用,比如:做公司網站的時候,可以定制一個公司簡稱的文件後綴!

#9楼 [楼主]   回复  引用  查看    

2007-03-20 15:50 by 自適應軟件......      
@幻想曲
沒錯,權限是ㄧ個問題!

实现HTTPHANDLER功能的另外一个选择是实现一个HANDLER FACTORY,这是通过实现IHTTPHANDLERFACTORY接口来实现的。 IHTTPHANDLERFACTORY接口的定义如下:
INTERFACE IHTTPHANDLERFACTORY
{
IHTTPHANDLER GETHANDLER(HTTPCONTEXT CTX,
STRING REQUESTTYPE,
STRING URL,
STRING PATHTRANSLATED);
VOID RELEASEHANDLER(IHTTPHANDLER HANDLER);
}


GETHANDLER方法在请求开始的时候被调用,而RELEASEHANDLER在请求结束,所有的HANDLER都不再需要的时候被调用。 使用HTTPHANDLERFACTORY的过程一般如下: 首先定义实际处理HTTPHANDLER的类,这个类会在HANDLERFACTORY中被调用以进行实际的处理:
PUBLIC CLASS BASICHANDLER : IHTTPHANDLER { ... }


然后,定义自己的HANDLERFACTORY:
PUBLIC CLASS BASICHANDLERFACTORY : IHTTPHANDLERFACTORY
{
PUBLIC IHTTPHANDLER GETHANDLER(HTTPCONTEXT CTX,
STRING REQUESTTYPE,
STRING URL,
STRING PATHTRANSLATED)
{
RETURN NEW BASICHANDLER();
}
PUBLIC VOID RELEASEHANDLER(IHTTPHANDLER HANDLER) {}
}


最后,在WEB.CONFIG文件中注册这个FACTORY:



TYPE="MYNAMESPACE.BASICHANDLERFACTORY, MYASSEMBLY" />



------(這樣就不需要配置IIS了)! 不過還是要註冊IIS.
@幻想曲 , 謝謝你提醒,我是剛剛差的資料就貼上來了,沒來得及調適.剛剛有測試了一下,發現還是要註冊IIS!!


可以參考MSDN.

#10楼    回复  引用  查看    

2007-03-20 15:53 by 补丁      
自己有主机的话,我还是习惯用mod_rewrite来重写
自己没有主机的话....呵呵,这个办法也不容易处理

#11楼    回复  引用  查看    

2007-03-20 15:57 by 壮志      
路过,感觉实际意义不大

#12楼    回复  引用  查看    

2007-03-20 16:05 by JesseZhao      
虚拟主机仿佛没有办法更改iis

#13楼    回复  引用  查看    

2007-03-20 16:13 by PureEviL      
微软的mspx页面有这个东西的影子

#14楼    回复  引用    

2007-03-20 16:13 by xxx [未注册用户]
http://blog.joycode.com/scottgu/archive/2007/03/01/94004.aspx

#15楼    回复  引用    

2007-03-20 16:22 by eeee [未注册用户]
mspx比较特殊一点,为了内容配置和管理的方便,结构是XML格式的,动态解析成页面的。

#16楼    回复  引用    

2007-03-20 16:25 by 幻想曲 [未注册用户]
@自適應軟件......
ms的urlrewriter就是实现的HANDLER FACTORY,即使你在web.config中注册
path="*.aaa"
也是需要改动iis的吧,你确定不需要修改iis?
今年后半年发布的IIS 7.0中不用配置IIS就能实现这种功能,只需要设置web.config即可,用IIS 6.0或更早版本的话不现实,因为大多数人用的都是虚拟主页,虚拟主机是不允许你自己设置IIS的。

#18楼 [楼主]   回复  引用  查看    

2007-03-20 16:56 by 自適應軟件......      
@ .Net开发资源精华网址收集
謝謝妳. 期待IIS7.0的發布!

#19楼    回复  引用  查看    

2007-03-20 18:53 by Jeffrey Zhao      
@.Net开发资源精华网址收集
IIS7.0用于虚拟主机的话,应该会限制用户如此定义的,我想。

#20楼    回复  引用  查看    

2007-03-20 20:24 by reonlyrun      
mark

#21楼    回复  引用    

2007-03-20 23:12 by City22 [未注册用户]
恩,其实就是.net下的servlet

#22楼    回复  引用  查看    

2007-03-21 00:56 by 晓风残月      
可以肯定的是:

1. 需要在 IIS ISAPI 中 注册新的扩展名,扩展的HttpHandler默认的页面使用 .ashx ,可以不用注册

2。虚拟主机确实不合适,因为你没权限,其实如果是虚拟主机空间的话一般也没有必要

#23楼    回复  引用    

2007-03-21 09:16 by 茄子 [未注册用户]
用cassini

#24楼    回复  引用  查看    

2007-03-21 09:28 by 喝酒的猫      
想法不错,但实际意义不大!

#25楼    回复  引用  查看    

2007-03-21 09:40 by 在北京的湖南人      
好像此文没有涉及到module,但是标题却写上了,应该来下篇关于httpmodule才是啊!

#26楼    回复  引用    

2007-03-21 10:10 by 陈杰 [未注册用户]
在 tmfc 翻译的<<了解ASP.NET底层架构>> 系列中http://tmfc.cnblogs.com/tmfc/archive/2006/09/02/493304.html, 对这个话题进行非常清楚的描述.

WebForm对于产生复杂的HTML页面来说是非常强大的,业务层逻辑需要图形布局工具和基于模块的页面.但是WebForm引擎做了一系列overhead intensive的任务.如果你想要做的是从系统中读入一个文件并通过代码将其返回的话,不通过WebForm框架直接返回文件会更有效率.如果你要做的是类似从数据库中读出图片的工作,并不需要使用页面框架-你不需要模板而且确定不需要Web页面并从中捕捉用户事件.

@ Jeffrey Zhao :
应该不会限制的,因为配置只影响当前的web站点,而不是所有站点,当前站点的配置权限应该都归还给站点的管理员,否则用IIS 7也没什么意义了。

#28楼    回复  引用  查看    

2007-03-22 12:52 by Shark Xu      
还是相当不错的

#29楼 [楼主]   回复  引用  查看    

2007-03-22 13:58 by 自適應軟件......      
@陈杰
看了,有收穫!

#30楼 [楼主]   回复  引用  查看    

2007-03-22 14:02 by 自適應軟件......      
@ 茄子

麻煩妳解釋一下cassini 好嗎?據我了解,他是個開源的咚咚!

#31楼    回复  引用  查看    

2007-04-06 17:22 by faib      
好帖,收藏之!!

#32楼    回复  引用    

2007-04-12 13:56 by tt [未注册用户]
http://www.8qu.net/register.asp?net=robin_pg

#33楼 [楼主]   回复  引用  查看    

2007-05-07 09:18 by 自適應軟件......      
http://www.cnblogs.com/mack/articles/40428.aspx

#34楼    回复  引用    

2007-07-11 19:20 by taia [未注册用户]
@ 幻想曲 & Clingingboy & slightboy

其实不用在IIS中注册对应的扩展名的,只需要在网站的web.config中加入对应的解析映射就行了

#35楼    回复  引用    

2007-12-05 18:22 by 阿龙009 [未注册用户]
如果在.Net调试环境下是不需要在IIS中进行isapi扩展设置的,但是如果应用程序一旦在发布状态下运行,就必须在IIS中进行isapi扩展设置,否则运行对应的文件时不会出现你想要的效果

#36楼    回复  引用    

2008-02-01 14:51 by zjysky [未注册用户]
web.config配置一下就可以了。不需要iis中改变的

#37楼    回复  引用    

2008-02-01 15:57 by zjysky [未注册用户]
我晕,iis必须配置才行。我刚才有试试
不过那个httpModuel这个东西不需要iis配置