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

原创 2007年09月27日 16:25:00
在前两篇文章中,我们已经创建了一个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();
    }
}
 

相关文章推荐

演练:创建和注册 HTTP 处理程序工厂

IHttpHandlerFactory 接口用于创建和管理处理请求的 HTTP 处理程序。 因此,可以创建一个实现 IHttpHandlerFactory 接口的类,然后将该类用作 HTTP 处理...

创建自定义 HTTP 处理程序

* HTTP 模块和 HTTP 处理程序是 ASP.NET 体系结构的组成部分。在对一个请求进行处理时,由多个 HTTP 模块     (例如,身份验证模块和会话模块)处理每个请求,然后再由单个 H...

HTTP错误 404.17 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理

Errore HTTP 404.2 - Not Found" IIS 7.5 请求的内容似乎是脚本,因而将无法由静态文件处理程序来处理  出现这种情况的原因通常是因为先安装了Framework...

第三章 HTTP请求处理程序

3.1 处理程序 所有的请求都要经过HttpApplication管道的处理。HttpApplication的作用是请求到达处理程序和离开处理程序的一个管道,这个管道提供了统一处理所有请求的机制,使...

Asp.net本质论之HTTP请求处理程序

主题 概要 Asp.net Http请求处理程序 编辑 时间 新建 20171113 序号 参考资料 1 Asp.net本质论 2...

如何:注册 HTTP 处理程序

创建自定义 HTTP 处理程序类后,必须在 Web.config 文件中注册该类。这将允许 ASP.NET 调用 HTTP 处理程序,以便处理对具有指定文件扩展名的资源的请求。 您注册 HTTP 处...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实战 HTTP 处理程序(HTTP Handler) -- 动态生成图片
举报原因:
原因补充:

(最多只允许输入30个字)