实战 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 处理程序(HTTP Handler) (3) -- 动态生成图片

实战 HTTP 处理程序(HTTP Handler) (3) -- 动态生成图片 在前两篇文章中,我们已经创建了一个HTTP处理程序,并实现了页面到HTTP处理程序之间的字符串参数的传递。下面让我们来...
  • vipxiaotian
  • vipxiaotian
  • 2007年10月23日 21:38
  • 423

实战 HTTP 处理程序(HTTP Handler) (2) -- 向HTTP 处理程序传递参数

实战 HTTP 处理程序(HTTP Handler) (2) -- 向HTTP 处理程序传递参数 我们在上一篇已经创建了一个最简单的HTTP 处理程序“MyHandler.jxd”,现在我们来对她稍作...
  • vipxiaotian
  • vipxiaotian
  • 2007年10月23日 21:36
  • 482

实战 HTTP 处理程序(HTTP Handler) 条码随意打

摘要本文介绍一个免费的、完整的、very easy 的在Web页和RDLC报表中呈现、打印条码的解决方案。效果笔者最近遇到了一个B/S结构的项目,需要在报表中打印条码。效果如下恰巧,笔者不久前在网上找...
  • shanliwa
  • shanliwa
  • 2007年09月27日 16:21
  • 714

实战 HTTP 处理程序(HTTP Handler) (6)---条码随意打

实战 HTTP 处理程序(HTTP Handler) (6)---条码随意打 摘要本文介绍一个免费的、完整的、very easy 的在Web页和RDLC报表中呈现、打印条码的解决方案。效果笔者最近遇到...
  • vipxiaotian
  • vipxiaotian
  • 2007年10月23日 22:08
  • 790

实战 HTTP 处理程序(HTTP Handler) (1) -- 创建一个最简单的 HTTP Handler

 实战 HTTP 处理程序(HTTP Handler) (1) -- 创建一个最简单的 HTTP Handler 我能得到什么?看过《实战 HTTP 处理程序(HTTP Handler)》系列的全部文...
  • vipxiaotian
  • vipxiaotian
  • 2007年10月23日 21:31
  • 513

【Java.Web】Servlet —— 实例 之 动态生成图像

动态生成图像
  • robinjwong
  • robinjwong
  • 2014年10月03日 01:44
  • 1295

没有为请求类型“GET”找到 HTTP 处理程序。

在使用mschart的页面提示错误信息如下: 没有为请求类型“GET”找到 HTTP 处理程序。   This is what you need for ASP.NET 4.0 / I...
  • chocolateboy
  • chocolateboy
  • 2013年04月03日 13:55
  • 3840

Ambiguous handler methods mapped for HTTP path

java.lang.IllegalStateException: Ambiguous handler methods mapped for HTTP path '/getPrams': {public...
  • yejin191258966
  • yejin191258966
  • 2014年11月06日 00:13
  • 21286

HTTP协议的处理流程

HTTP协议 流程
  • yongsan01
  • yongsan01
  • 2016年09月28日 15:14
  • 305

第三章 HTTP请求处理程序

3.1 处理程序 所有的请求都要经过HttpApplication管道的处理。HttpApplication的作用是请求到达处理程序和离开处理程序的一个管道,这个管道提供了统一处理所有请求的机制,使...
  • qin_zhangyongheng
  • qin_zhangyongheng
  • 2016年11月07日 22:04
  • 768
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:实战 HTTP 处理程序(HTTP Handler) -- 动态生成图片
举报原因:
原因补充:

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