上次讲了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 ) {}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public void ReleaseHandler( IHttpHandler handler ) {
// TODO: Add HttpHandlerFactory.ReleaseHandler implementation
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
public IHttpHandler GetHandler( HttpContext context, string requestType, string url, string pathTranslated ) {
Request request = new Request( context, requestType, url );
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
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();
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
if ( context.Session != null && context.Session.IsCookieless == false ) {
return new AjaxHandler();
}
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
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 请求提供服务的内部服务器对象(如 Request、 Response、 Session 和 Server)的引用。
上一篇中讲到web.config文件中有自定义的HttpHandler.
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)
context
HttpContext 类的实例,它提供对用于为 HTTP 请求提供服务的内部服务器对象(如 Request、 Response、 Session 和 Server)的引用。
-
requestType
- 客户端使用的 HTTP 数据传输方法( GET 或 POST)。 url
- 所请求的原始地址. pathTranslated
- 所请求资源的当前应用程序的根目录的文件系统路径. 该方法中只有一个IF语句,仔细一看,就是根据不同的条件返回一个IHttpHandler接口,从context.Request["_Session"]中可以看出作者的意图是根据是否启用Session来返回不同的IHttpHandler,我们就从最普通的不启用Session的IHttpHandler看起,也就是 return new AjaxHandler();这句,AjaxHandler类的内容更加少:
![](https://i-blog.csdnimg.cn/blog_migrate/a41954a27d6ad96fa2c2cf816e677448.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/37c8bf68cdc3cc81759c34160776bc53.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/6a9c071a08f1dae2d3e1c512000eef41.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/717446ca04a6125dc5b6b54e0fa14ab4.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/0196c3df5ea9e936f21e9932cca91014.gif)