ASP.NET网页编程之IIS7 会重用那些不应重用 HttpHandler
有理由相信是能提供更出色的性能。很多平台无法支持复杂的编译器,因此需要二次编译来减少本地编译器的复杂度。当然可能做不到java编译器那么简易。iis起首,完成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我接纳其新的设置形式,将<httpHandlers/>设置在<system.webServer/>节,而不是<system.web/>节,这是仿照着ASP.NETAjax的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)。
最初,我选择了先接纳JeffreyZhao倡议的workaround,就是再制造一个HttpHandlerFactory,它卖力每次前往Page的新实例,然后在设置中改用该HttpHandlerFactory。这个办理计划实行证实是可行的,就是多一个类罢了,不晓得功能丧失有几。假如有人晓得这个成绩的官方办理计划的话,大概有一个更好的workaround,请告知我,感谢。
归根到底,Java跨平台可以,但是要重新编写代码,否则还分什么J2EE/J2SE/J2ME呢! CGI程序在运行的时候,首先是客户向服务器上的CGI程序发送一个请求,服务器接收到客户的请求后,就会打开一个新的Process(进程)来执行CGI程序,处理客户的请求。CGI程序最后将执行的结果(HTML页面代码)传回给客户。 可以通过在现有ASP应用程序中逐渐添加ASP.NET功能,随时增强ASP应用程序的功能。ASP.NET是一个已编译的、基于.NET的环境,可以用任何与.NET兼容的语言(包括VisualBasic.NET、C#和JScript.NET.)创作应用程序。另外,任何ASP.NET应用程序都可以使用整个.NETFramework。开发人员可以方便地获得这些技术的优点,其中包括托管的公共语言运行库环境、类型安全、继承等等。 比如封装性、继承性、多态性等等,这就解决了刚才谈到的ASP的那些弱点。封装性使得代码逻辑清晰,易于管理,并且应用到ASP.Net上就可以使业务逻辑和Html页面分离,这样无论页面原型如何改变。 Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。 Servlet却在响应第一个请求的时候被载入,一旦Servlet被载入,便处于已执行状态。对于以后其他用户的请求,它并不打开进程,而是打开一个线程(Thread),将结果发送给客户。由于线程与线程之间可以通过生成自己的父线程(ParentThread)来实现资源共享,这样就减轻了服务器的负担,所以,JavaServlet可以用来做大规模的应用服务。 ASP.net1.1和2.0在程序上的语法也有很大不同,现在2.0属于新出来的,不知道半年后会不会有3.0(说笑一下)。Windows2003系统自动支持ASP和ASP.net环境,不用安装任何程序。Asp.net属于编译语言。ASP的最大不同(ASP属于解释语言)。 是指转换后的Servlet程序代码的行数。这给调试代码带来一定困难。所以,在排除错误时,可以采取分段排除的方法(在可能出错的代码前后输出一些字符串,用字符串是否被输出来确定代码段从哪里开始出错)。 最强的技术支持WebService,而且有.NET的所有library做后盾。而且ASP.NET在.NET3.5中还有微软专门为AJAX开发的功能--ASP.NETAJAX。
页:
[1]