注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天涯倦客的博客

祝福你朋友永远快乐!

 
 
 

日志

 
 

httpModules与httpHandlers之httpHandlers  

2013-03-07 15:45:58|  分类: asp.net |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

HttpHandler

  HttpHandler是HTTP请求的处理中心,真正地对客户端请求的服务器页面做出编译和执行,并将处理过后的信息附加在HTTP请求信息流中再次返回到HttpModule中

  HttpHandler与HttpModule不同,一旦定义了自己的HttpHandler类,那么它对系统的HttpHandler的关系将是“覆盖”关系

  IHttpHandler接口声明

  public interface IHttpHandler

  {

  bool IsReusable { get; }

  public void ProcessRequest(HttpContext context); //请求处理函数

  }

 

示例:把硬盘上的图片以流的方式写在页面上 

复制代码
class TestHandler : IHttpHandler

{
  public void ProcessRequest(HttpContext context)
  {
    FileStream fs = new FileStream(context.Server.MapPath("worm.jpg"), FileMode.Open);
    byte[] b = new byte[fs.Length];
    fs.Read(b, 0, (int)fs.Length);
    fs.Close();
    context.Response.OutputStream.Write(b, 0, b.Length);
  }

  public bool IsReusable
  {
    get
      {
        return true;
      }
  }

}
复制代码

 

Web.Config配置文件

  

<httpHandlers>

  <add verb="*" path="*" type="ClassLibrary831.TestHandler,ClassLibrary831"></add>

</httpHandlers>

 

  Verb属性:指定了处理程序支持的HTTP动作。*-支持所有的HTTP动作;“GET”-支持Get操作;“POST”-支持Post操作;“GET, POST”-支持两种操作。

  Path属性:指定了需要调用处理程序的路径和文件名(可以包含通配符)。“*”、“*.aspx”、“showImage.aspx”、“test1.aspx,test2.aspx”

  Type属性:用名字空间、类名称和程序集名称的组合形式指定处理程序或处理程序工厂的实际类型。ASP.NET运行时首先搜索bin目录中的DLL,接着在GAC中搜索。

  这样程序运行的效果是该网站的任何一个页面都会显示worm.jpg图片。

  如何只让一个页面(default21.aspx)执行HttpHandler中的ProcessRequest方法呢?最简单的办法是在Web.Config文件中把path配置信息设为default21.aspx。

 

==============分割线==================

IHttpHandler工厂

  IHttpHandlerFactory的作用是对IHttpHandler进行管理。工厂的作用请见http://hi.baidu.com/grayworm/blog/item/4a832160f8c9de46eaf8f8c1.html"

  IHttpHandlerFactory接口的声明:

  public interface IHttpHandlerFactory

  {

  IHttpHandler GetHandler (HttpContext context,string requestType,string url,string pathTranslated);

  void ReleaseHandler (IHttpHandler handler);

  }

  GetHandler返回实现IHttpHandler接口的类的实例,ReleaseHandler使工厂可以重用现有的处理程序实例

 

示例:两个用IHttpHandlerFactory来实现对不同HttpHandler的调用。

  有两个HttpHandler:将图片显示在页面上的HttpHandler和生成验证码的Handler

 

//将图片显示在页面上的Handler 

复制代码
class TestHandler : IHttpHandler
{
  public void ProcessRequest(HttpContext context)
  {
    FileStream fs = new FileStream(context.Server.MapPath("worm.jpg"), FileMode.Open);
    byte[] b = new byte[fs.Length];
    fs.Read(b, 0, (int)fs.Length);
    fs.Close();
    context.Response.OutputStream.Write(b, 0, b.Length);
  }   
public bool IsReusable   {   get   {   return true;   }   } }
复制代码

 

  

//生成验证码的Handler 

复制代码
class CodeHandler:IHttpHandler
{
  public bool IsReusable
  {
  get
    {
      return true;
    }
  }

  public void ProcessRequest(HttpContext context)
  {
    Image b = new Bitmap(50,20);
    Graphics g = Graphics.FromImage(b);
    SolidBrush sb = new SolidBrush(Color.White);
    Font f = new Font("宋体", 12);
    string str = "";
    Random r = new Random();

  for (int i = 0; i < 4; i++)
    {
      str += r.Next(10);
    }

  g.DrawString(str,f,sb,0,0);

  b.Save(context.Response.OutputStream, System.Drawing.Imaging.ImageFormat.Jpeg);

  }
}  
复制代码

 

 

IHttpHandler工厂  

复制代码
class TestHandlerFactory : IHttpHandlerFactory
{
  public IHttpHandler GetHandler(HttpContext context, string requestType, string url, string pathTranslated)
 {
    string fname = url.Substring(url.IndexOf('/') + 1);
    while (fname.IndexOf('/') != -1)
    fname = fname.Substring(fname.IndexOf('/') + 1);
    string cname = fname.Substring(0, fname.IndexOf('.'));
    string className ="";
    className = "ClassLibrary831.CodeHandler";
    object h = null;
  try
    {
    //h = new TestHandler();
    h = Activator.CreateInstance(Type.GetType(className));
    }

  catch (Exception e)
  {
    throw new HttpException("工厂不能为类型" + cname + "创建实例。", e);
  }

  return (IHttpHandler)h;
 }

  public void ReleaseHandler(IHttpHandler handler)
  {

  }
}(车延禄)
复制代码

 

 

配置文件

<httpHandlers>
<add verb="*" path="default21.aspx,default22.aspx" type="ClassLibrary831.TestHandlerFactory,ClassLibrary831"></add>
</httpHandlers>

 

  这样TestHandlerFactory就会根据请求的不同页面执行不同的HttpHandler处理程序了。

from:http://www.cnblogs.com/wxh19860528/archive/2012/07/09/2582935.html

  评论这张
 
阅读(491)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017