Asp.Net HttpContext.RemapHandler 用法
最近在看HttpHandler映射过程文章时发现Context对象中有一个RemapHandler方法,它能将当前请求映射到指定的HttpHandler处理,可跳过系统默认的Httphandler。它的好处是我们可以在代码中根据需求动态的指定HttpHandler。个人觉得挺好用,就分享给大家。
通过.net 反编译工具看到获取HttpHandler的方法,关键代码如下:
- internal IHttpHandler MapHttpHandler(HttpContext context, string requestType,
 - VirtualPath path, string pathTranslated, bool useAppConfig)
 - {
 - IHttpHandler handler = (context.ServerExecuteDepth == 0) ? context.RemapHandlerInstance : null;
 - using( new ApplicationImpersonationContext() ) {
 - if( handler != null )
 - return handler;
 - HttpHandlerAction mapping = this.GetHandlerMapping(context, requestType, path, useAppConfig);
 - if( mapping == null )
 - throw new HttpException("Http_handler_not_found_for_request_type");
 - IHttpHandlerFactory factory = this.GetFactory(mapping);
 - IHttpHandlerFactory2 factory2 = factory as IHttpHandlerFactory2;
 - if( factory2 != null )
 - handler = factory2.GetHandler(context, requestType, path, pathTranslated);
 - else
 - handler = factory.GetHandler(context, requestType, path.VirtualPathString, pathTranslated);
 - this._handlerRecycleList.Add(new HandlerWithFactory(handler, factory));
 - }
 - return handler;
 - }
 
我们来看这段:
- IHttpHandler handler = (context.ServerExecuteDepth == 0) ? context.RemapHandlerInstance : null;
 - using( new ApplicationImpersonationContext() ) {
 - if( handler != null )//如果调用了HttpContext.RemapHttpHandler方法,则直接返回设置的HttpHandler对象,跳过后面获取系统默认的HttpHandler处理程序
 - return handler;
 
如果之前调用了HttpContext.RemapHttpHandler()方法,则返回Context.RemapHandlerInstance,即RemapHttpHandler方法指定的HttpHandler实例。
实例:
Global.asax中的Application_BeginRequest事件中指定自定义的TestHandler类
- public class Global : System.Web.HttpApplication
 - {
 - protected void Application_BeginRequest(object sender, EventArgs e)
 - {
 - HttpApplication app = (HttpApplication)sender;
 - app.Context.RemapHandler(new TestHandler());
 - }
 - }
 
TestHandler.cs
- public class TestHandler:IHttpHandler
 - {
 - public bool IsReusable
 - {
 - get { return true; }
 - }
 - public void ProcessRequest(HttpContext context)
 - {
 - context.Response.Write("TestHandler");
 - }
 - }
 
Default.aspx
- <body>
 - <form id="form1" runat="server">
 - <div>
 - Default.aspx
 - </div>
 - </form>
 - </body>
 
在网址中输入请求Default.aspx,响应结果:
可以看出,系统调用了自定义的TestHandler,没有执行Default.aspx页面
Asp.Net HttpContext.RemapHandler 用法的更多相关文章
- ASP.NET MVC HtmlHelper用法集锦
		
ASP.NET MVC HtmlHelper用法集锦 在写一个编辑数据的页面时,我们通常会写如下代码 1:<inputtype="text"value='<%=View ...
 - Asp.Net  Server.MapPath()用法
		
做了一个上传文件的功能 本地测试没问题 部署到服务器之后 一直报错 由于 某些历史原因 看不到错误信息 最后发现是路径的问题 其实这么简单的问题 最早该想到的 ...... Server.MapPat ...
 - ASP.NET中EVAL用法大全
		
<%# Bind("Subject") %> //绑定字段<%# Container.DataItemIndex + 1%> //实现自动编号<%# ...
 - C# Eval在asp.net中的用法及作用
		
Eval( " ")和Bind( " ") 这两种一个单向绑定,一个双向绑定,bind是双向绑定,但需数据源支持 ASP.NET 2.0改善了模板中的数据绑定操 ...
 - ASP.NET HttpContext类
		
IHttpHandler 接口 定义 ASP.NET 以异步方式处理使用自定义 HTTP 处理程序的 HTTP Web 请求而实现的协定 封装http请求信息 HttpContext.Curren ...
 - [转]C# Eval在asp.net中的用法及作用
		
原文链接:http://www.cnblogs.com/Mr_JinRui/archive/2010/07/06/1772129.html Eval( " ")和Bind( &qu ...
 - ASP.NET MVC5----基本用法
		
由于之前在项目中也使用MVC进行开发,但是具体是那个版本就不是很清楚了,但是我觉得大体的思想是相同的,只是版本高的在版本低的基础上增加了一些更加方便操作的东西.下面是我学习ASP.NET MVC5高级 ...
 - C# ASP.NET MVC HtmlHelper用法大全
		
UrlHrlper 下面的两个地址一样的功能 下边这个防止路由规则改变 比如UserInfo/Index改为UserInfo-Index,使用下面的不受影响 另一种形式的超链接: <%: Htm ...
 - asp.net  Gridview 的用法
		
留个档. <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="Fa ...
 
随机推荐
- wubi安装ubuntukylin-14.04
			
自ubuntukylin-14.04发布以来一直想体验一下,正好五一休假有了时间,在经历了一番坎坷后终于安装成功.安装环境为Win7家庭高级版,至于采用wubi方式安装,只因Linux水平差和图省事, ...
 - 别踩白块儿游戏源码Android版
			
这个项目有带说明文档,大家可以看看源码附件的说明文档吧,“别踩白块儿”是目前非常火的一款游戏,游戏非常简单刺激.关于具体怎么火法怎么玩我就不多说了,相信看到本文的朋友们都非常地清楚. 什么游戏火,我们 ...
 - linux mail利用外部邮箱地址发邮件
			
mail命令发送邮件需要sendmail或postfix服务 三种常用格式发信 mail -s "标题" xxx@xxx.xxx #第一种方法,你可以把当前shell当成编辑器来用 ...
 - EF with (LocalDb)V11.0
			
EF虽说对LocalDb支持的不错,但LocalDb有自身的缺陷(不想sqlite那样数据库文件可以像普通文件一样使用). LocalDb在一个计算机上会对数据库有唯一性约束,要求本机的localdb ...
 - Python版本2.7切3.5和3.5切2.7
			
在Ubuntu上是自带Python2.7和3.5的 当你在终端输入Python的时候是显示Python2.7的 叫大家你怎么切换到Python3.5版本 1,查看是否存在python3.5终端输入 c ...
 - MMORPG大型游戏设计与开发(服务器 游戏场景 核心详述)
			
核心这个词来的是多么的高深,可能我们也因为这个字眼望而却步,也就很难去掌握这部分的知识.之所以将核心放在最前面讲解,也可以看出它真的很重要,希望朋友们不会错过这个一直以来让大家不熟悉的知识,同我一起进 ...
 - JSONResult 封装
			
import java.util.List; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson. ...
 - UVA 11404 Palindromic Subsequence[DP LCS 打印]
			
UVA - 11404 Palindromic Subsequence 题意:一个字符串,删去0个或多个字符,输出字典序最小且最长的回文字符串 不要求路径区间DP都可以做 然而要字典序最小 倒过来求L ...
 - Winform窗体的基本控件
			
一.窗体的事件 每一个窗体都有一个事件,这个窗体加载完成之后执行哪一段代码 位置:(1)右键属性→事件→load 双击进入.(2)双击窗体任意一个位置进入 public partial class F ...
 - 玩 perf
			
有一个进程happy在执行,另一个进程spy发送了一个信号把happy给杀死了 我怎么能通过perf抓到spy进程? happy进程一直执行 在spy进程中调用kill(happy's pid) ,发 ...