ITPub博客

首页 > Linux操作系统 > Linux操作系统 > asp.net实现页面的一般处理程序(CGI)学习笔记

asp.net实现页面的一般处理程序(CGI)学习笔记

原创 Linux操作系统 作者:iDotNetSpace 时间:2009-02-17 16:09:55 0 删除 编辑

ASP.NET提供低级别的请求/响应 API,使开发人员能够使用 .NET 框架类为传入的 HTTP 请求提供服务。为此,开发人员需创作支持  System.Web.IHTTPHandler 接口和实现 ProcessRequest()方法的类。当处理 HTTP 请求不需要由高级别的 页框架抽象化提供的服务时,处理程序通常很有用。处理程序的常用用途包括筛选器和类似 CGI 的应用程序,尤其是那些返回二进制数据的应用程序。

 ASP.NET  收到的每个传入 HTTP 请求最终由实现 IHTTPHandler 的类的特定实例来处理。IHttpHandlerFactory 提供了处理  IHttpHandler 实例 URL 请求的实际解析的结构。除了 ASP.NET 提供的默认 IHttpHandlerFactory 类外, 开发人员还可以选择创建和注册工厂以支持大量的请求解析和激活方案。

    从这段文字可以看出,当aspx页面不涉及。net框架提 供的高级界面技术(如数据缓存、状态保持、Web窗体控件引用等等)时,且向客户端输出的不是复杂的HTML文本,特别是只向客户端返回二进制数据(如图 片,声音等)时,可以用一个。cs应用程序文件(本文使用c#语言,如果是用VB或JScript,……)来替代,而该应用程序必须有一个实现 System.Web.IHTTPHandler 接口和并实现 ProcessRequest() 方法的类。一个简单的例子如下:

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    public class ImageHander : IHttpHandler, IReadOnlySessionState
    {

        public void ProcessRequest(HttpContext context)
        {
            string ProcessID= context.Request.QueryString["ProcessID"];

            if (!string.IsNullOrEmpty(ProcessID))
            {
                Array arr = (Array)context.Session[ProcessID];
                context.ClearError();
                context.Response.Expires = 0;
                context.Response.Buffer = true;
                context.Response.Clear();

                MemoryStream memStream = new MemoryStream((byte[])arr);
                memStream.WriteTo(context.Response.OutputStream);
                memStream.Close();

                context.Response.ContentType = "image/jpg";
                context.Response.StatusCode = 200;
                context.Response.End();
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
页面上调用:
                int i = 1;
                byte[] pictureData = GetPictureData(Server.MapPath("Images/Factorymethod.jpg"));
                Session[i.ToString()] = pictureData;
                this.Image1.ImageUrl = "ImageHander.ashx?ChartID="+i;
GetPictureData方法如下:
Code
  public byte[] GetPictureData(string imagepath)
        {
            FileStream fs = new FileStream(imagepath, FileMode.Open);//可以是其他重载方法
            byte[] byData = new byte[fs.Length];
            fs.Read(byData, 0, byData.Length);
            fs.Close();
            return byData;
        }
最后生成出来的效果就是在页面上展示了Images下的Factorymethod.jpg。

另外一个例子:

namespace WebApplication1
{
    /**////


    /// $codebehindclassname$ 的摘要说明
    ///

    [WebService(Namespace = "http://tempuri.org/")]
    [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
    /**////类必须实现IHttpHandler接口。如果程序将访问会话状态(Session),则必须实现 IRequiresSessionState 接口(不包含任何方法的标记接口)。*/
    public class DLLHander : IHttpHandler
    {
        public void ProcessRequest(HttpContext context)
        {
            HttpResponse res = context.Response;
            res.Write("");
            res.Write("

DllHander处理


");
            res.Write("本页面直接由DLL处理");
            res.Write("");
        }

        public bool IsReusable
        {
            get
            {
                return true;
            }
        }
    }
}
在配置文件web.config中添加aspx->dll映射,添加后,web.config应该是这样子的:
 
       
     

 现在当浏览器访问时这个地址时候 http://localhost/WebApplication1/index.aspx 实际上就是调用了WebApplication.dll中DLLHander类的ProcessRequest方法,在浏览中应该可以看到一个简单的页面。

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/12639172/viewspace-553567/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2008-01-04

  • 博文量
    2376
  • 访问量
    5309323