All articles| All Pictures| All Softwares| All Video| Go home page| Write articles| Upload pictures

Reading number is top 10 articles
Phalanger-PHP的.NET编译器_php资料_编程技术
解决SQL Server 2000中讨厌的Bug_[SQL Server教程]
关于MSSQL数据库日志满的快速解决办法_[SQL,Server教程]
Linux系统Apache用户授权和访问控制_php资料_编程技术
PHP基础:PHP4和PHP5的配置异同比较_php资料_编程技术
细说HTML元素的ID和Name属性的区别_[Html教程]
Active,Directory如何用C#进行增加、删除、修改、查询用户与组织单位_[Asp.Net教程]
SQL循序渐进(21)更多的子查询_[SQL,Server教程]
WML学习(七):CGI编程_[XML教程]
sql server的保留关键字_[SQL Server教程]
Reading number is top 10 pictures
全球十大灵异酒店
NeedWallpaper6
英雄联盟超神十连杀截图
Absolutely shocked. National geographic 50 animal photographys4
2013中国四川省高考作文
2012 national geographic daily picture2
Terrorist smile the largest human history an explosion1
中国文革时期的色情图片1
美女挤公交
The world's top ten most beautiful railway station2
Download software ranking
Unix video tutorial10
jBuilder2006
Ashlynn Video3
Love the forty days
Sora aoi - one of more PK
Tram sex maniac 2 (H) rar bag10
Kung.Fu.Panda.2
美女写真1
Boxer's Top ten classic battle7
Boxer's Top ten classic battle3
aaa published in(发表于) 2013/12/15 8:42:39 Edit(编辑)
IIS7,会重用那些不该重用,HttpHandler_.net资料_编程技术

IIS7,会重用那些不该重用,HttpHandler_.net资料_编程技术

IIS7 会重用那些不该重用 HttpHandler_.net资料_编程技术-你的首页-uuhomepage.com

首先,实现IHttpHandler时要实现一个IsReusable的属性,这个属性告诉ASP.NET此HttpHandler是否可重用。如果一个HttpHandler是可重用的,那么多次请求都有可能用同一个HttpHandler实例;而如果一个HttpHandler是不可重用的,那么ASP.NET应该确保每次请求使用的都是一个新构造的HttpHandler实例。


Page是设计为不可重用,所以每次请求都会导致构造一个新的Page实例,这是因为Page的生命周期不能恢复到初始状态,一个Page经历完生命周期后就不能用于处理下一次的请求。类似的,如果我们有一个HttpHandler有类似的性质,处理一次请求后其状态就难以恢复到适合于处理下一次请求,或者说恢复还不如构造一个新的,那么我们就应该设计为不可重用。


我在做一个通过IFrame提交的无刷新上传控件,这东西包括一些HttpHandler,为的是能够直接关联到axd后缀而用于路径无关的场合。其中有一个HttpHandler我直接继承自Page,并且写得好像aspx+cs编译出来的代码那样,在OnInit阶段构建完整的控件树。这个HttpHandler以前在XP的IIS5上一直没问题的,但到了Vista的IIS7就出问题了。


先说明,在IIS7我采用其新的配置模式,将配置在节,而不是节,这是模仿着ASP.NET Ajax的web.config做的。做好之后就发现问题了,这个用作HttpHandler的Page竟然时候抛出Exception,说Page上面有多于一个的HtmlForm。仔细检查后确认,我的Page代码确实仅仅添加了一个HtmlForm,并且这个Exception不会出现在编译后的第一次请求,于是我就怀疑Page被重用了,所以OnInit被多次执行,这才可能导致它有多于一个HtmlForm。我启用了Page的Trace,在Render中注释掉base.Render,并且用Trace输出Page上的HtmlForm数量,发现真的是每次请求都会导致多一个HtmlForm,这基本上可以肯定是因为Page被重用了。


然后我就用Google搜索,结果发现forums.asp.net上有人提出了完全一样的问题,他也是用Page来做HttpHandler。我想只有拿Page来做HttpHandler的人才会遇到这样的问题,因为一般自己写的HttpHandler都是无状态的,所以都是可以重用的。而那张帖子只有管理员回复了一句,“你最好去forums.iis.net问吧”。于是我就去iis.net搜索,结果发现没有人提到过这个问题,于是只好自己去论坛提问,可惜等了一天都没有人回答,看来IIS7普及之前iis.net的人气都不会上升(IIS7的默认欢迎页面链接到iis.net)。


最后,我选择了先采用Jeffrey Zhao建议的work around,就是再制作一个HttpHandlerFactory,它负责每次返回Page的新实例,然后在配置中改用该HttpHandlerFactory。这个解决方案实验证明是可行的,就是多一个类而已,不知道性能损失有多少。如果有人知道这个问题的官方解决方案的话,或者有一个更好的work around,请告诉我,谢谢。





添加到del.icio.us 添加到新浪ViVi 添加到百度搜藏 添加到POCO网摘 添加到天天网摘365Key 添加到和讯网摘 添加到天极网摘 添加到黑米书签 添加到QQ书签 添加到雅虎收藏 添加到奇客发现 diigo it 添加到饭否 添加到飞豆订阅 添加到抓虾收藏 添加到鲜果订阅 digg it 貼到funP 添加到有道阅读 Live Favorites 添加到Newsvine 打印本页 用Email发送本页 在Facebook上分享


Disclaimer Privacy Policy About us Site Map

If you have any requirements, please contact webmaster。(如果有什么要求,请联系站长)
Copyright ©2011-
uuhomepage.com, Inc. All rights reserved.