CharlesChen's Technical Space

简单实用是我一直在软件开发追求的目标(I Focus on. Net technology, to make the greatest efforts to enjoy the best of life.)
Not the best, only better
  博客园  :: 首页  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2009-02-17 00:24  Charles Chen  阅读(2866)  评论(1编辑  收藏  举报

     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

最后生成出来的效果就是在页面上展示了Images下的Factorymethod.jpg。

另外一个例子:

namespace WebApplication1
{
    
/// <summary>
    
/// $codebehindclassname$ 的摘要说明
    
/// </summary>

    [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(
"<html><body>");
            res.Write(
"<h1>DllHander处理</h1><hr>");
            res.Write(
"本页面直接由DLL处理");
            res.Write(
"</html></body>");
        }


        
public bool IsReusable
        
{
            
get
            
{
                
return true;
            }

        }

    }

}
在配置文件web.config中添加aspx->dll映射,添加后,web.config应该是这样子的:
 <httpHandlers>
        
<add verb="*" path="Index.aspx" type="WebApplication1.DLLHander,WebApplication1"/>
      
</httpHandlers>

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

最后希望朋友们提出问题,共同解决。谢谢!

Charles Chen

MSN:  Charles.C.Chen@newegg.com  

Email:  gotosunny@msn.com