Asp.NET Ajax学习笔记(3) -- Ajax.NET源程序分析1

     上次讲了Ajax.NET如何工作的基本思路.今天把我看Ajax.NET源程序的一些想法写在这里.我看的Ajax.NET的版本是5.7.22.2,  还有5.7.25.1beta版本在 http://ajax.schwarz-interactive.de/CSharpSample/ 这里.另外与这个项目类似的还有一个 Ajax.NET Professional的项目,是Ajax.NET的升级项目,这个项目等咱学习完Ajax.NET这个项目之后再学习吧.现在把Ajax.NET项目文件列表的图列在下面,文件不是很多,比较适合我这些初学者学习提高.

  上一篇中讲到web.config文件中有自定义的HttpHandler.
< httpHandlers >
    
< add  verb ="POST,GET"  path ="ajax/*.ashx"  type ="Ajax.PageHandlerFactory, Ajax"   />
</ httpHandlers >
 其中,type属性中的"Ajax.PageHandlerFactory"表示Ajax命名空间中的PageHandlerFactory类,也就是说,ASP.NET把所有指向ajax目录下的以.ashx后缀的请求都交给这个类,该类就是上图中倒数第二个文件.该文件不长,我把整个文件列在下面:
namespace  Ajax  {
    
internal class PageHandlerFactory : IHttpHandlerFactory {
        
public void RemovedCallback( string k, object v, CacheItemRemovedReason r ) {}

        
public void ReleaseHandler( IHttpHandler handler ) {
            
// TODO:  Add HttpHandlerFactory.ReleaseHandler implementation
        }


        
public IHttpHandler GetHandler( HttpContext context, string requestType, string url, string pathTranslated ) {
            Request request 
= new Request( context, requestType, url );

            
if ( request.Extension == Utility.HandlerExtension ) // && (request.FileName.IndexOf(",") > 0 || request.FileNameWithoutExtension.ToLower() == "common"))
            {
                
if ( context.Request[ "_session" ] != null ) {
                    
if ( context.Request[ "_session" ] == "rw" ) {
                        
return new AjaxHandlerSessionStateRW();
                    }
 else if ( context.Request[ "_session" ] == "r" ) {
                        
return new AjaxHandlerSessionStateR();
                    }
 else if ( context.Request[ "_session" ] == "no" ) {
                        
return new AjaxHandler();
                    }

                }


                
if ( context.Session != null && context.Session.IsCookieless == false ) {
                    
return new AjaxHandler();
                }


                
return new AjaxHandlerSessionStateR();
            }
 else {
                
throw new HttpException( 403"The type of page you have requested is not served because it has been explicitly forbidden. The extension '." + request.Extension + "' may be incorrect. Please review the URL below and make sure that it is spelled correctly." );
            }

        }

    }

}
该类实现了IHttpHandlerFactory接口,该接口要求实现GetHandler和RealseHandler两个方法,主要是GetHandler方法,该方法的四个参数说明如下,这是.NET SDK的说明.
context
         HttpContext 类的实例,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 RequestResponseSessionServer)的引用。
requestType
客户端使用的 HTTP 数据传输方法( GETPOST)。
url
所请求的原始地址.
pathTranslated
所请求资源的当前应用程序的根目录的文件系统路径.
该方法中只有一个IF语句,仔细一看,就是根据不同的条件返回一个IHttpHandler接口,从context.Request["_Session"]中可以看出作者的意图是根据是否启用Session来返回不同的IHttpHandler,我们就从最普通的不启用Session的IHttpHandler看起,也就是 return new AjaxHandler();这句,AjaxHandler类的内容更加少:
namespace  Ajax  {
    
internal class AjaxHandler : PageHandler {
        
internal AjaxHandler() {}

        
public override void ProcessRequest( HttpContext context ) {
            AjaxRequestProcessor proc 
= new AjaxRequestProcessor( context );

            proc.Run();
        }

    }

}
该类只实现了继承自PageHandler的ProcessRequest方法,PageHandler类是实现IHttpHandler接口的一个帮助类.ProcessRequest是IHttpHandler接口要求实现的方法,意思就是处理请求,当有Ajax请求是,先执行GetHandler,再执行ProcessRequest,这里该方法实例化,AjaxRequestProcessor类,并调用它的Run方法来正式处理该请示.Run方法比较长,Ajax.NET框架的核心思想都在这里,关于这个方法到下次再写吧......
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值