在ProcessRequest中,利用WriteFile将ExportPicture方法生成的临时GIF文件直接写入 HTTP 内容输出流。4.      对Web.config文件的设置编译以上程序生成WebChart.dll,为了能让IhttpHandler起作用,还必须在测试工程的web.config文件中加入以下配置信息:                   其中path属性值为请求文件名,type属性值由组件命名空间WebChartCtl、IhttpHandler接口实现类名RequestHandler、组件文件名WebChart组成的字符串:"WebChartCtl.RequestHandler,WebChart"。显然,这种配置行为给组件WebChart的使用带来了一些不便,考虑到web.config是XML文档,我们完全可以用System.xml来自动完成对web.config的配置,在类WebChart中插入代码如下:       //在WEB.CONFIG中配置HttpHandler
       private void RegesterHttpHandler()
       {
           string spath="handler.aspx";
           string stype="WebChartCtl.RequestHandler,WebChart";
           string filename=this.Page.Request.PhysicalApplicationPath + @"web.config";
 
           XmlNode root, e,HttphandlerNode;
           XmlDocument   xmldoc= new XmlDocument();
           xmldoc.Load(filename);
 
           root=FindElement(xmldoc.DocumentElement,"system.web");
           if (root==null) return;
 
           e=FindElement(root,"httpHandlers");
           if (e==null)
           {
              HttphandlerNode=xmldoc.CreateElement("httpHandlers");
    this.CreateAddElem(xmldoc,(XmlElement)HttphandlerNode,spath,stype);
              root.InsertBefore(HttphandlerNode,root.FirstChild);
           }
           else
              SeekAddElemAndCreateIt(xmldoc,e,spath,stype);
           xmldoc.Save(filename);
       }
 
       //子过程,寻找指定的节点
       private XmlNode FindElement(XmlNode elem,string elemName)
       {
           XmlNode findit=null;
           foreach(XmlNode e in elem.ChildNodes)
           {
              if(e.Name.ToLower()==elemName.ToLower())
              {
                  findit=e;
              }
           }
           return findit;
       }
 
       //查看是否包含节,如果配置信息不正确修正它
       private void SeekAddElemAndCreateIt(XmlDocument xmldoc,  XmlNode HttphandlerNode,string spath,string stype)
       {
           XmlNode findit=null;
           bool b=false;
 
           foreach(XmlNode e in HttphandlerNode.ChildNodes)
           {
              if(e.Name.ToLower()=="add")
              {
                  b=(e.Attributes["verb"].InnerXml=="*")&&
    (e.Attributes["path"].InnerXml.ToLower()==spath.ToLower())&&
    (e.Attributes["type"].InnerXml.ToLower()==stype.ToLower());
                  if (b) {findit=e;break;}
              }
           }
           if (!b)    CreateAddElem(xmldoc,(XmlElement)HttphandlerNode,spath,stype);
       }
 
       //创建节的配置信息
       private void CreateAddElem(XmlDocument xmldoc,XmlElement HttphandlerNode,string spath,string stype)
       {
           XmlElement subnode;
           subnode=xmldoc.CreateElement("add");
           subnode.SetAttribute("verb","","*");
           subnode.SetAttribute("path","",spath);
           subnode.SetAttribute("type","",stype);
           HttphandlerNode.InsertBefore(subnode,HttphandlerNode.FirstChild);
       }
 
       //在Web页初始化时,对web.config中填入正确的设置
       protected override void OnInit(EventArgs e)
       {
           base.OnInit (e);
           this.RegesterHttpHandler();
       }
四、    WebChart控件的应用实例
至此,已完成所有组件代码的编写,将工程WebChartCtl编译为WebChart.dll,即可测试应用。步骤如下
1)      在磁盘上建立名为TestChart的文件夹,并利用IIS将其设为虚拟目录,如图3,在Visual Studio.net 开发环境中选择文件->新建->项目->Visual C#项目->ASP.NET Web应用程序,并和WebChartCtl一样,引用OWC10.DLL(如图2),选右键菜单,将测试表单WebForm1设为“起始页”,并确保Web.Config文件可读写。图3 建立测试工程 图4 向工具箱中添加WebChart.dll 
2)      从工具箱选项夹“WEB窗体”中拖动Lable,向WebForm1中添加控件Lable1, Text属性设为“WebChart运行实例”;3)      在工具箱上,右键选择“添加/移除项”,弹出对话框如图4,选择“浏览”找到“….\WebChartCtl\bin\Debug\WebChart.dll”,将控件WebChart显示于工具箱中,拖动WebChart图标,为WebForm1中添加控件WebChart14)      双击WebForm1,编辑以下代码:using OWC10;
       private void Page_Load(object sender, System.EventArgs e)
       {
           //创建图表空间实例
      OWC10.ChartSpaceClass Chs=this.WebChart1.ChartSpace;
           //设置数据库连接串以及SQL数据命令
      Chs.ConnectionString=@"Provider=SQLOLEDB;Data source=(local);Initial Catalog=northwind;User Id=sa;Password=";
           Chs.CommandText=@"SELECT  YEAR(ShippedDate) AS YEAR, MONTH(ShippedDate) as month,SUM(Subtotal) AS Total FROM [Summary of Sales by Year]  GROUP BY YEAR(ShippedDate), MONTH(ShippedDate)";
            //设置图表的系列,分类轴,数据轴 
      Chs.SetData(ChartDimensionsEnum.chDimSeriesNames,0,"YEAR");     
           Chs.SetData(ChartDimensionsEnum.chDimCategories,0,"MONTH ");    
           Chs.SetData(ChartDimensionsEnum.chDimValues,0,"Total");
           //设置标题
      Chs.HasChartSpaceLegend=true;
           Chs.HasChartSpaceTitle=true;
           Chs.ChartSpaceTitle.Caption="Summary of Sales by Year";
           ChChart Cht=Chs.Charts[0];
            //设置图表类型,缺省为直方图,显现以下一行代码即为立体饼图
      //Cht.Type=ChartChartTypeEnum.chChartTypePie3D;
           //当图表类型为ChartChartTypeEnum.chChartTypePie3D时,
//以下代码必须去除,否则代码无法执行
ChAxis X,Y;
Y=Cht.Axes[ChartAxisPositionEnum.chAxisPositionLeft];
           Y.HasTitle=true;
           Y.Title.Caption="Total";
           Y.NumberFormat="Currency";
X=Cht.Axes[ChartAxisPositionEnum.chAxisPositionCategory];
           X.HasTitle=true;
           X.Title.Caption="Year";
       }
 运行工程,结果如图5,如果根据代码注释内容修改代码,运行结果如图6。以上代码运行环境为Windows 2000 Professional,IIS5.0,Visual Studio.NET 2003, Office XP, SQL Server 2000。
图5 各年度销售业绩对比直方图 图6 1996年各月销售业绩饼图 
五、    总结
       以上内容综合了自定义WebControl技术、XML技术、IHttpHandler接口使用方法,对OWC10进行了重新封装,为实现WEB统计图表功能提供了一个非常实用的解决方案。笔者在WebChart中只对OWC10 中的接口ChartSpace进行了封装,目的在于不丢失OWC10编程时的灵活性,有兴趣的读者可以进一步研究OWC的帮助文档,设计出贴近个性需求的接口。
来源:csdn