如何从UserControl中引用HTTP处理程序



说到创建ASP,我是个新手。. NET自定义用户控件,该控件将呈现.png图表并将其返回给asp.net。. NET web应用程序。

我已经创建了一个简单的沙盒项目,它在位图上创建一个椭圆,将其呈现到MemoryStream,现在我想通过HTTP处理程序将输出流式传输,以便在我的标记页面中呈现asp:图像。

我的问题是,我不知道如何连接在我的usercontrol创建的MemoryStream到http处理程序的GetImage方法。我知道在方法中创建内存流的HTTP处理程序的GetMethod是不正确的,但我不知道如何访问代码背后的内存流。

我的原型测试项目代码是:
namespace ChartControl
{
    public partial class ChartCtl : System.Web.UI.UserControl
    {
        private int imageHeight = 150;
        private int imageWidth = 400;
        protected void Page_Load(object sender, EventArgs e)
        {
            renderChart();
        }
        protected MemoryStream renderChart()
        {
            Image imgChart = new Bitmap(imageWidth, imageHeight);
            Graphics g = Graphics.FromImage(imgChart);
            Rectangle r = new Rectangle(0, 0, imageWidth, imageHeight);
            g.DrawEllipse(Pens.Orange, g.VisibleClipBounds);
            MemoryStream ms = new MemoryStream();
            imgChart.Save(ms, ImageFormat.Png);
            return ms;
        }
     }
}

My HTTP Handler is:

namespace WIChart.UserControls
{
    public class ImageHandler : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();
            if (!String.IsNullOrEmpty(context.Request.QueryString["id"]))
            {
                int id = Int32.Parse(context.Request.QueryString["id"]);
                // Now we have the id, just pass it to GetImage to build the image
                Image image = GetImage(id);
                context.Response.ContentType = "image/png";
                image.Save(context.Response.OutputStream, ImageFormat.Png);
            }
            else
            {
                context.Response.ContentType = "text/html";
                context.Response.Write("<p>Valid id is required.</p>");
            }
        }
        #region IHttpHandler Members
        public bool IsReusable
        {
            get { return false; }
        }
        private Image GetImage(int id)
        {
            MemoryStream stream = new MemoryStream();
            return Image.FromStream(stream);
        }
        #endregion
    }
}

我的。ascx页面是:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="ChartCtl.ascx.cs" Inherits="ChartControl.ChartCtl" %>
<%@ Register Assembly="System.Web.DataVisualization, Version=4.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" Namespace="System.Web.UI.DataVisualization.Charting" TagPrefix="asp" %>

<div class="content-wrapper">
    <div class="float-left">
        <p class="site-title">
            <asp:Image id="imgChart" ImageUrl="~/ImageHandler.ashx?id=1" runat="server" />
        </p>
    </div>
</div>

谢谢你能提供的任何帮助!

我不明白你到底需要什么。但是您可以使用下面的代码从用户控件加载图像。

using System.Web;
using System.Web.UI;
using System.IO;
namespace WebApplication1
{
    public class ImageHandler : Page, IHttpHandler
    {
        public new void ProcessRequest(HttpContext context)
        {
            context.Response.Clear();
            ChartCtl chartCtl = (ChartCtl)LoadControl(ResolveClientUrl("ChartCtl.ascx"));
            MemoryStream ms = new MemoryStream();
            ms = chartCtl.renderChart(ms);
            context.Response.Clear();
            context.Response.ContentType = "image/jpeg";
            context.Response.BinaryWrite(ReadFully(ms));
            context.Response.End();
        }
        public static byte[] ReadFully(Stream input)
        {
            byte[] buffer = new byte[16 * 1024];
            using (MemoryStream ms = new MemoryStream())
            {
                int read;
                while ((read = input.Read(buffer, 0, buffer.Length)) > 0)
                {
                    ms.Write(buffer, 0, read);
                }
                return ms.ToArray();
            }
        }
        #region IHttpHandler Members
        public new bool IsReusable
        {
            get { return false; }
        }
        #endregion
    }
}
HTML——

<asp:Image ID="imgChart" ImageUrl="~/ImageHandler.ashx" runat="server" />

ChartCtrl——

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.IO;
using System.Drawing;
using System.Drawing.Imaging;
namespace WebApplication1
{
    public partial class ChartCtl : System.Web.UI.UserControl
    {
        private int imageHeight = 150;
        private int imageWidth = 400;
        public MemoryStream renderChart(MemoryStream ms)
        {
            Image imgChart = new Bitmap(imageWidth, imageHeight);
            Graphics g = Graphics.FromImage(imgChart);
            Rectangle r = new Rectangle(0, 0, imageWidth, imageHeight);
            g.DrawEllipse(Pens.SteelBlue, g.VisibleClipBounds);
            imgChart.Save(ms, ImageFormat.Jpeg);                    // save the image to the memorystream to be processed via the Image/HttpHandler
            imgChart.Save(Context.Response.OutputStream, ImageFormat.Jpeg);    // save to drive just to verify that image is being properly created.
            return ms;
        }
    }
}

网络。配置[IIS 7] -

<system.webServer>
    <modules runAllManagedModulesForAllRequests="true"/>
    <handlers>
      <add name="ImageHandler" verb="*"
       path="ImageHandler.ashx"
       type="WebApplication1.ImageHandler, WebApplication1"
       resourceType="Unspecified" />
    </handlers>
  </system.webServer>

Mem从流创建字节数组

也查看此链接http://www.codeproject.com/Articles/34084/Generic-Image-Handler-Using-IHttpHandler

p。S -我不知道为什么你的代码只与构造函数执行。没有构造函数,我就可以执行代码。当你从Handler加载web控件时,正常的页面事件不会被执行。我们需要手动调用方法。

我认为您需要在IIS中托管您的网站以获得HTTpHandler调用,我不确定这部分

使用imagehandler作为页面有点向后——尝试将页面视为静态HTML,其中引用图像,答案非常简单。你需要做的是添加一个图像标签,引用你的图形生成处理程序——即<img src="~/MyHandler.ashx" />

那么问题就变成了如何将数据封送到处理程序中。有很多方法可以处理这个问题,最基本的是查询字符串变量,如果数据很简单,或者查询字符串有足够的数据,这样处理程序可以返回并加载它自己的数据。

最新更新