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

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() 方法的类。一个简单的例子如下:

页面上调用:

                 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方法,在浏览中应该可以看到一个简单的页面。

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

    [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;
            }

        }

    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值