kunl 发表于 2015-8-14 10:18:24

Inside IIS And ASP.NET [ 3 ]

  实现IHttpHandler接口
与ISAPI扩展类似的是处理器提供了低层次的访问HTTP请求与响应对象的方式。实现一个自定义处理器允许处理你所指定的某种不同的资源请求。你可以在请求过程中截取请求并且重载对它的响应。举例来说,假如你希望记录那些对服务端禁止访问文件发出请求的客户端IP地址,那么你可以写一个自定义的处理器在这些受拒绝的请求被抛出异常之前记录所需要的信息。你可能想要为这些请求发送一些热情洋溢的文字,以下代码展示了这些:



创建一个自定义处理器意味着需要创建一个.NET组件并且实现IHttpHandler接口,这个接口有以下成员:

ProcessRequest()    这个方法调用运行时来处理请求
IsReusable               这个属性指出如果有多个请求那么将共享同一个(处理器)Handler

ProcessRequest()对于请求会传递一个HttpContext对象,通常在处理请求时会用到HttpRequest,HttpResponse,HttpSessionState对象。
注释:如果希望访问Session对象那么就必须实现IRequiresSessionState接口

这有个HttpHandler的简单例子,它只是输出一些文字到浏览器


public class ForbiddenLogHandler: IHttpHandler
{
public ForbiddenLogHandler()
{
}
public virtual void ProcessRequest(HttpContext context)
{
    context.Trace.Write("ForbiddenLogHandler.ProcessRequest()");
    HttpResponse rs = context.Response;
    HttpRequest rq = context.Request;
    rs.Write(&quot;<p><H1>We know who you are</H1></p>&quot;);
    rs.Write(&quot;You were referred by &quot; + rq.UrlReferrer + &quot;<br>&quot;);
    rs.Write(&quot;Your IP is&quot; + rq.UserHostAddress + &quot;<br>&quot;);
    rs.Write(&quot;Your domain is&quot; + rq.UserHostName + &quot;<br>&quot;);
    rs.Write(&quot;<p>Why were you requesting a restricted resource?</p>&quot;);
}
public virtual bool IsReusable
{
    get{ return true; }
}
}
  
  
  下面的Web.Config配置区域配置指出对于任何*.cs,*.resx,*.config文件的请求使用ForbiddenLogHandler进行处理。
<httpHandlers>
<add verb=&quot;*&quot; path=&quot;*.cs&quot; type=&quot;WebHandlers.ForbiddenLogHandler,WebHandlers&quot;/>
   <add verb=&quot;*&quot; path=&quot;*.resx&quot; type=&quot;WebHandlers.ForbiddenLogHandler,WebHandlers&quot;/>
   <add verb=&quot;*&quot; path=&quot;*.config&quot; type=&quot;WebHandlers.ForbiddenLogHandler,WebHandlers&quot;/>
</httpHandlers>
  
未完待续
页: [1]
查看完整版本: Inside IIS And ASP.NET [ 3 ]