频道直达 - 专题 - 新闻 - 技巧 - 组网 - 开发 - 安全 - web编程 - 图像 - 操作系统 - 数据库 - 教育 - 旅游 - 健康 - 时尚 - 驱动 - 软件 - 游戏 - 多媒体 - ERP - 讨论组

用winform的方式操纵webform--浅谈IHttpHandler

来源: 作者: 出处:巧巧读书 2006-09-05 进入讨论组

  好久以前看过一篇有关自定义IHttpHandler的文章,当时就想写点自己的体会,一直没空。今天就说说这个吧。首先谈谈ASP.net的一些参数传递和页面定向的方式
第一,ASP.net是用Page.Navigate()调用新页面的URL。Page.Navigate()向浏览器返回了一个http状态码302,使得浏览器向server请求那个新的URL。这种导航方法导致每次客户请求都需两次在client和server之间往返。第二,任何要传递到新页面的信息都需作为URL的参数或存储在Session中或存储在数据库中以便新页面得到这些信息。传统的ASP开发人员很习惯这种做法,但其他的web编程人员则有一些更高级的方法。但是很明显的这两个页面是有依赖性的,而依赖性是编译器捕捉不到的也是不容易在设计阶段建模的。所以在debug时,参数是否被正确的传递就只有我们自己检查了。再有传统的数据传递方式有可能会暴露一些关键的数据。更为关键的是这使得面向对象的设计变得很复杂。当然我并没有否定传统的方式,我这是在强调ASP.net缺乏对服务器端的多页面之间的通信的支持。
但是我们可以自定义httphandler来扩充这种支持。
开始之前,我们先来看一下ASP.net怎样处理页面请求,ASP.net是通过System.Web.UI.PageHandlerFactory类的实例来处理。PageHandlerFactory依赖于另一个类PageParser。一个页面在第一次请求时PageParser把它编译成一个真正的.Net的类并cache已编译的实例
HttpApplication
    |
    |1.GetHandler()
    |
PageHandlerFactory
    |
    |2.GetCompiledPageInstance()
    |
PageParser
我们要做的第一步是override由ASP.net提供的页面生成过程。所以我们必须创建一个类实现IHttpHandlerFactory接口,我们需要实现的只有两个方法,一个是GetHandler(),它是在一个HTTP Request开始时被调用;另一个是ReleaseHandler(),调用可以让IHttpHandlerfactory进行清理工作。    
例子:
using System;
using System.Web;
using System.Web.UI;

namespace Michael.Web.HttpHandler
{
    /// <summary>
    /// 一个简单的HttpHandler
    /// </summary>
    public class Factory:System.Web.IHttpHandlerFactory
    {
        public IHttpHandler GetHandler(HttpContext context, string url, string path, string objectName)
        {
            return Controller.getViewObject(path, objectName, context);
        }
        
        public void ReleaseHandler(IHttpHandler Handler)
        {
        }
    }
}

注意:GetHandler()必须返回一个实现IHttpHandler接口的对象,Controller是另一个我们自定义的类
接下来我们要修改web.config
<configuration>
  <httphandlers>
    <add verb="*" path="*.ASPx" type="Michael.Web.HttpHandler.Factory,Michael.Web.HttpHandler" />
  </httphandlers>
</configuration>
我们这里还是采用.ASPx作为后缀名,其实你可以自定义这个后缀名

例子:Controller.cs
namespace Michael.Web.HttpHandler
{
        using System;
    using System.Web;
    using System.Web.UI;
    using System.Collections.Specialized;

    /// <summary>
    ///    Controller继承了System.Web.UI.Page作为ASP.NET页面的handler
    /// </summary>
    public class Controller : System.Web.UI.Page
    {
        public Controller()
        {
           this.Init += new System.EventHandler( Base_Init );
        }

        protected void Page_Load( object sender, EventArgs e )
        {
               //将提交页面的对象名存储在hidden里
               string a_ObjectName = this.GetType().Name;
        a_ObjectName = a_ObjectName.Substring ( 0, a_ObjectName.Length - 5 );
                this.RegisterHiddenField( LAST_VIEW_OBJECT, a_ObjectName );                     
        }

        protected void Page_Init( object sender, EventArgs e )
        {
            this.Load += new System.EventHandler ( this.Base_Load );
        }

    //////////////////
    ///创建页面实例,允许服务器端通讯
    //////////////////
    protected IHttpHandler createInstanceOf( string ObjectName )
    {
        string a_Path = Request.ApplicationPath + "/" + ObjectName;
        return Controller.getPage( a_Path, this.Context.Request.MapPath(ObjectName) , Context );
    }

    protected virtual IHttpHandler getNextPage() { return null; }
        
    protected override void Render( HTMLTextWriter writer )
    {
        IHttpHandler aHandler = this.getNextPage();

        if( aHandler == null )
        {
            base.Render ( writer );
        }
        else
        {
            if( aHandler is Controller )
            {
                ( ( Controller )aHandler ).overrideLoadState = true;
            }

            aHandler.ProcessRequest ( this.Context );
        }
    }

    /////////////////
    ///先检查hidden看是否有提交页面名称,如没有则返回浏览器请求的URL
    /////////////////
    public static IHttpHandler getViewObject( string Path, string ObjectName , HttpContext Context )
    {
   图 文 结 合:http://www.qqread.com/dotnet/d240491.html进入讨论组讨论。
收藏此文】【 】【打印】【关闭
相关图文阅读
频道图文推荐
健 康 咨 询
时 尚 咨 询
巧巧读书宗旨
相关专题
最新论坛文章
站内各频道最新更新文档
站内最新制作专题
热门关键字导读
Photoshop教 程照片处理 照片制作 PS快捷键 抠图
计 算 机 故 障XP系统修复
艺 术 与 设 计设计 流媒体 设计欣赏 边框
计 算 机 安 全ARP
站内频道文章精选
巧巧电脑频道编辑信箱  告诉我们您想看的专题或文章