关闭

实战 HTTP 处理程序(HTTP Handler) -- 动态生成图片

427人阅读 评论(0) 收藏 举报
在前两篇文章中,我们已经创建了一个HTTP处理程序,并实现了页面到HTTP处理程序之间的字符串参数的传递。下面让我们来作个比较实用的东西--一个类似于 Google Analytics 的GridView,实现后的效果见下图。


实现方法

Step1:实现动态生成图片。首先,为类库 mylib.system.web 添加对 System.Drawing 的引用。然后,编写如下代码根据传给 MyHandler.jxd 的参数动态生成一个图片,并写到 Response 的 OutputsStream 里面。MyHandler.cs的代码如下

using System;
using System.Collections.Generic;
using System.Text;

using System.IO;
using System.Drawing;
using System.Drawing.Imaging;

namespace mylib.system.web
{
    
public class MyHandler : System.Web.IHttpHandler
    {
        
#region IHttpHandler 成员

        
public bool IsReusable
        {
            
get { return false; }
        }

        
public void ProcessRequest(System.Web.HttpContext context)
        {
            
// 获取参数n,并将其转换为Int型。
            string n = context.Request.QueryString["n"];
            
int count = 0;
            
int.TryParse(n, out count);

            
// 使用GDI+函数画一个长方形。
            Bitmap bmp = new Bitmap(count, 20);
            Graphics graphic 
= Graphics.FromImage(bmp);
            MemoryStream stream 
= new MemoryStream();
            SolidBrush brush 
= new SolidBrush(Color.SteelBlue);

            
try
            {    
                graphic.FillRectangle(brush, 
00, count, 20);

                
// 将画好的图形保存到内存中。
                bmp.Save(stream, ImageFormat.Png);

                
// 将内存中的图片发送到客户端
                context.Response.ContentType = "image/png";
                context.Response.OutputStream.Write(stream.ToArray(),
0,(int)stream.Length);
            }
            
finally
            {
                
// 释放资源
                stream.Close();
                brush.Dispose();
                brush 
= null;
                graphic.Dispose();
                graphic 
= null;
            }
        }
        
#endregion
    }
}

Step2:在Web程序的 Default.aspx 中放置一个 GridView 控件。并为其添加两个模板列。一列用于显示“网址”;另一列中放一个 Image 控件和一个 Label  控件,用于显示访问量。Label  控件直接绑定到数组下标为1的字段,就不用多说了。Image 控件通过“ImageUrl= '<%# "~/MyHandler.jxd?n=" + Eval("[1]") %>'”这样的绑定表达式向 MyHandler.jxd 发送带参数的请求,Myhandler.cs 将根据参数 n 的值生成相应大小的图片并发送给 Image 控件。


<%@ Page Language="C#" AutoEventWireup="true"  CodeFile="Default.aspx.cs" Inherits="_Default" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    
<title>无标题页</title>
</head>
<body>
    
<form id="form1" runat="server">
    
<div>
        
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" CellPadding="3" GridLines="Vertical" BackColor="White" BorderColor="#999999" BorderStyle="None" BorderWidth="1px">
            
<FooterStyle BackColor="#CCCCCC" ForeColor="Black" />
            
<Columns>
                
<asp:TemplateField HeaderText="网址">
                    
<ItemTemplate>
                        
<asp:Label ID="Label1" runat="server" Text='<%# Eval("[0]") %>'></asp:Label>
                    
</ItemTemplate>
                
</asp:TemplateField>
                
<asp:TemplateField HeaderText="访问量">
                    
<ItemTemplate>
                        
<asp:Image ID="Image1" runat="server" ImageUrl= '<%# "~/MyHandler.jxd?n=" + Eval("[1]") %>' />
                        
<asp:Label ID="Label1" runat="server" Text='<%# Eval("[1]") %>'></asp:Label>
                    
</ItemTemplate>
                
</asp:TemplateField>
            
</Columns>
            
<RowStyle BackColor="#EEEEEE" ForeColor="Black" />
            
<SelectedRowStyle BackColor="#008A8C" Font-Bold="True" ForeColor="White" />
            
<PagerStyle BackColor="#999999" ForeColor="Black" HorizontalAlign="Center" />
            
<HeaderStyle BackColor="#000084" Font-Bold="True" ForeColor="White" />
            
<AlternatingRowStyle BackColor="#DCDCDC" />
        
</asp:GridView>
        
    
</div>
    
</form>
</body>
</html>

Step3:作一些测试数据,并绑定到 GridView 中。

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.Collections.Generic;

public partial class _Default : System.Web.UI.Page 
{
    
protected void Page_Load(object sender, EventArgs e)
    {
        List
<string[]> data = new List<string[]>();
        data.Add(
new string[] { "1. 使用分治法实现的全排列算法""50" });
        data.Add(
new string[] { "2. 让Ruby的数组支持任意起始下标""16" });
        data.Add(
new string[] { "3. 输出二叉树的方法""14" });
        data.Add(
new string[] { "4. 让ruby以矩阵的样式输出二维数组""9" });
        data.Add(
new string[] { "5. 算法分析涉及到的一些函数图像""8" });

        GridView1.DataSource 
= data;
        GridView1.DataBind();
    }
}
 
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:400936次
    • 积分:7440
    • 等级:
    • 排名:第2925名
    • 原创:334篇
    • 转载:23篇
    • 译文:1篇
    • 评论:52条
    文章分类
    最新评论