您的位置:首页 > 编程语言 > ASP

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

2010-12-24 15:11 821 查看
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() 方法的类。一个简单的例子如下:

在ashx一般处理程序文件中不能使用session和request的问题解决办法
在ashx里添加using System.Web.SessionState;
类继承IHttpHandler, IReadOnlySessionState

[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






{




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

最后希望朋友们提出问题,共同解决。谢谢!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: