快速报表的HTTPC处理程序

来源:互联网 发布:降低手机网络延迟 编辑:程序博客网 时间:2024/05/16 14:10

  今天,重新温习了ASP.NET内部机理,对HTTP处理程序和模块的相关知识进行了整理,有一中拨开云雾见太阳的感觉,记得刚第一次开这部分的时候,对于ISAPI ,APPLICATION管道及HTTP处理程序和模块那是一团雾水,看完可几本大部头的书之后,再回过头来研究,终于知道怎么回事了,简单的将.IIS就是一请求处理的工厂,而ISAPI组件就是安装在各个车间的各类机械,而整个 请求与响应的过程就是一条"来料加工的生产线"生产线,对不同的"请求料"用在这个程序流水线的不同阶段用相应的"处理机"进行处理,最终输出不同的页面产品.这样开来,程序员其实更钳工的工作类似,一般的钳工用车床及别的工作做东西,高级钳工为了提高工作效率会针对不同产品需要做一些顺手的模具,而ASP.NET中的HTTP处理程序不就是程序员给自己工作做的"程序处理模具"吗?不过程序员的模具得到服务器上注册,以取得在服务器上的使用权方可发挥效用。

从对ASP.NET的底层架构来看,我又对程序的基本思想又了深入的理解:程序是用来处理数据,着力要解决的是输入与输出的问题,开始的时候,我们满足输入保存输出,一个基本的I/O系统可以完成我们对信息处理的基本需求,后来信息的多样性和计算能力的不断提升,使我们对计算机信息处理产生了更多的需求,于是就有了面向对象,类、接口这些听起来很神秘而艰深的字眼,程序越做越多,我们将不同的编程的设计原则进行了归类整理,把他们叫做设计模式,为了让做的程序标准化,利于协作完成,我们需要三层架构及N层架购来支撑,应用程序的设计更多的是组件的组装。不过无论多复杂,程序皆来自于数据+算法;

想到这,我又想都我的本行,我本专业是会计,从事管理工作,在我所学知识中,会计来自于一个简单的恒等式:资产=负债+所有者权益,会计核算所有的规则都与此有关;而不断延伸的经济学虽浩若烟海,但去仔细解读包括国际金融政策,国家利率杠杆对货币市场与股票市场的协调等大的政策,无一不回归到“资源的有限与人的欲望的无限”这一基本命题,万事皆有源。这就叫透过现象看本质吧。

以上可以算是一些“编程的哲学”吧。

下面是今天的抄做的一个HTTP处理的例程,觉的其中有几点特别经典,拿来与大家共享,特别是和我一样刚刚入门的兄弟们共同学习

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Text;
using System.IO;
using System.Xml;
using System.Web.Hosting;
using System.Collections.Specialized;
using System.Data.SqlClient;
/// <summary>
/// 这是一个用处理数据信息的HTTP处理程序,
/// 处理的用户请求资源为以sqlx为扩展名的xml文件
/// 示例如下
/// <queries>
/// <querry connstring="Persist Security Info=False;Initial Catalog=Northwind;Data Source=CW31">
/// select firstname,lastname,country from employyes
/// </querry>
/// </queries>
/// httphandler的processRequest方法先从xml文件中提取信息,然后在执行查询并生成输出
/// </summary>
/// 

//1、定义一个包含请求处理文件信息的数据传递的类
public class sqldata
{
    
public string connectionstring;
    
public string querrytext;
}

//2、主处理类,实现IHttpHandler
public class xmldate:IHttpHandler 

{
    
//辅助方法,解析xml文件,这是很经典的例子,可以作为xml的一般性解析方式
    private sqldata[] parseFile(HttpContext contex)
    
{
        
//生成一xmlDocument实例,并将请求文件加在此模型上
        XmlDocument xmlfile = new XmlDocument();
        
using (Stream file = VirtualPathProvider.OpenFile(contex.Request.Path))
        
{
            xmlfile.Load(file);
        }

        
//读取xml文件的节点,并将文挡信息读入到数据传递类的元素中
        XmlNodeList nodes = xmlfile.SelectNodes("queries/query");
        sqldata[] sqldates 
= new sqldata[nodes.Count];
        
for (int i = 0; i < sqldates.Length; i++)
        
{
            XmlNode childnode 
= nodes[i];
            sqldata childsqldata 
= new sqldata();
            sqldates[i] 
=childsqldata ;
            
try
            
{
                childsqldata.connectionstring 
= childnode.Attributes["connectionstring"].Value;
                childsqldata.querrytext 
= childnode.InnerText;

            }

            
catch (Exception)
            
{

                contex.Response.Write(
"Error parsing the input file");
            }



        }

        
return sqldates;
 
    }

    
//将读取的xml中的数据库连接字符串和命令文本进行处理,并生成HTML标记

    
private StringCollection datastr(sqldata[] descriptors)
    
{
        StringCollection col 
= new StringCollection();
        
foreach (sqldata data in descriptors)
        
{
            DataTable table 
= new DataTable();
            SqlDataAdapter dataapp
=new SqlDataAdapter(data.querrytext,data.connectionstring);
            dataapp.Fill(table);
            GridView gridview
=new GridView();
            gridview.DataSource
=table;
            gridview.DataBind();
            
string controlrender=stringunit.controltohtmlstring(gridview);
            col.Add(controlrender);
        }

        
return col;
    }


    
IHttpHandler 成员
}

// 一个常用的类,将控件转化为字符串
public static  class stringunit
{
    
static stringunit()
    
{
        
//
        
// TODO: 在此处添加构造函数逻辑
        
//
    }

    
    
public static string controltohtmlstring(Control ctl)
    
{
        StringWriter strwriter 
= new StringWriter();
        HtmlTextWriter htmwrite 
= new HtmlTextWriter(strwriter);
        ctl.RenderControl(htmwrite);
        
return strwriter.ToString();

    }

}


<httphandlers>
        
<httphandler>
          
<add verb="*" path=".sqlx" type="xmldate"/>
        
</httphandler>
      
</httphandlers>