HttpApplication的问题,求教!!感谢!

问题描述

当一个请求到达时,HttpApplicationFactory会从HttpApplication对象池中分配一个HttpApplication对象用于处理这个请求。1、在应用程序中,第一次的请求到达时,会先初始化HttpApplicationFactory,在初始化过程中,会提取Global.asax类的信息(调用Application_Start方法),然后HttpApplicationFactory会从HttpApplication对象池中分配一个HttpApplication对象,但由于是第一次访问,此时对象池中不存在可以分配的HttpApplication对象,所以HttpApplicationFactory会创建一个HttpApplication对象用于处理当前请求,HttpApplication在创建过程中会经过各种HttpModule进行事件注册。2、在第一次请求还未结束时,第二个请求到达,此时由于对象池中只有一个HttpApplication对象,但此对象仍在处理第一个请求,所以此时HttpApplicationFactory又会创建一个新的HttpApplication对象,同样,会对该HttpApplication对象进行初始,经过各种HttpModule进行事件注册。我现在搞不清楚Global.asax与HttpApplication对象是什么关系。a、已知的是Global.asax是派生HttpApplication类的。那HttpApplicatonFactory每次请求创建的新的HttpApplication对象是否是Global.asax的实例对象呢?b、Gobal.asax到底有什么作用,仅仅是用于应用程序第一次请求时进行应用程序全局的一些操作?c、这里红线的意思是,HttpApplication对象就是Global.asax的实例,那么一个应用程序中不就会存在多个Global对象,Application_Start应用程序为什么只会执行一次?求解答呀,很费解呀!!!谢谢!!!

解决方案

本帖最后由 u011964267 于 2015-09-11 21:40:39 编辑
解决方案二:
自己顶一个呀,帮忙解答一下呀,各位
解决方案三:
使用工厂类就是在不能确定最终生成的是哪一个类时使用的,此处当然就是Global类Global类里有些什么东西,那就是它的作用,至于你用不用是另外一回事.如果懂了继承就知道Global的实例就是HttpApplication实例,但如果销毁了再生成,Application_Start就不止会运行一次了.
解决方案四:
引用2楼tcmakebest的回复:

使用工厂类就是在不能确定最终生成的是哪一个类时使用的,此处当然就是Global类Global类里有些什么东西,那就是它的作用,至于你用不用是另外一回事.如果懂了继承就知道Global的实例就是HttpApplication实例,但如果销毁了再生成,Application_Start就不止会运行一次了.

如你所说,当应用程序最初进来的3个请求,如没有application对象池中没有复用的httpapplication对象,则会创建3个httpapplication对象,也就是global实例?既然是这样,都有3个global实例了,何谈什么全局?而且即然有3个实例了,为何只有一个globa实例会执行application_start方法呢?另个2个不执行了?或者是否可以这样说,只有应用程序的第一个请求时才会调用global中的application_start方法?通过什么方法来保证这样的机制?我所知的方法有个是静态构造,只会调用一次。
解决方案五:
引用楼主u011964267的回复:

a、已知的是Global.asax是派生HttpApplication类的。那HttpApplicatonFactory每次请求创建的新的HttpApplication对象是否是Global.asax的实例对象呢?b、Gobal.asax到底有什么作用,仅仅是用于应用程序第一次请求时进行应用程序全局的一些操作?c、这里红线的意思是,HttpApplication对象就是Global.asax的实例,那么一个应用程序中不就会存在多个Global对象,Application_Start应用程序为什么只会执行一次?

a.IIS通过ISAPI然后通过asp.net引擎启动的用于处理页面请求的,应该就是。b.每一个请求都会使用一个HttpApplication实例。可能你以为一个asp.net网站总共只需要一个实例,这是错误的!每一个请求都需要一个实例,这样就能并发多用户访问。这有点像是ADO.NET的连接池一样似地,多个并发请求都访问同一个连接字符串的标记的数据库,看似只公共同一个Dbconnection实例就行了,而实际上是连接池可以有多达200个实例。HttpApplication也是这样,每一个HttpContext上下文对象都会被分配有一个独立的HttpApplication。只有当当前系统的线程池的可用线程低于某个在asp.net系统中规定的数值时,asp.net才会将请求放入Queue,以后再处理;否则就会动态地反射创建一个新的HttpApplication实例。因此你把HttpApplication看成仅仅是什么“全局操作”,这是错误的。它是针对每一次并发请求而设计的代理,只不过让你以为是同步非并发的。c.Application_Start执行一次,这不代表着它的宿主对象就是只能有一个。asp.net只对第一个HttpApplication实例才通知其调用其能够触发这个事件的方法,不代表着它就只有一个实例。
解决方案六:
否则就会动态地反射创建一个新的HttpApplication实例-->否则就会获取一个旧的或者反射创建一个新的HttpApplication实例软件架构往往都是千百次重构的结构,随着功能和性能要求的改变不断改变架构设计。因此有时候你需要理解别人的架构,而不是按照自己的想象来要求架构是什么样子的。因此我们看一个系统,不是仅仅看文字说明,必须看源代码。
解决方案七:
而实际上是连接池可以有多达200个实例-->而实际上是连接池可以有多达逻辑连接200个实例你最主要的误会就出HttpApplication多实例的问题上。同一个asp.net应用会在必要时使用超过100个HttpApplication实例,以这个为框架基础。

时间: 2024-10-03 19:49:36

HttpApplication的问题,求教!!感谢!的相关文章

grunt-这是Gruntfile.js中的配置代码,求教大神帮我解释下,万分感谢

问题描述 这是Gruntfile.js中的配置代码,求教大神帮我解释下,万分感谢 这是watch插件的配置信息: watch: { options: { dateFormat: function (time) { grunt.log.writeln('The watch finished in ' + time + 'ms at' + (new Date()).toString()); grunt.log.writeln('Waiting for more changes...'); }, li

求教visual studio 2008 升级方法!非常感谢呀!

问题描述 去年安装的visualstudio2008打开用时提示试用版评估期已结束,需要升级.本人是新手,望某位前辈不吝指教!非常感谢! 解决方案 解决方案二:网上找个注册码注册了解决方案三:下个VS2010用得了..

照着集成sdk视频写的源码,为什么点击发送的时候就报错。求教,万分感谢!!

问题描述 debug发现执行这一句的时候就没有进去,而是直接跳出来了EMChatManager.getInstance().sendMessage(message, new EMCallBack(){                    @Override                    public void onError(int arg0, String arg1) {                        // TODO Auto-generated method stu

新人求教已个问题,感谢

问题描述 importjava.util.*;publicclasstest{publicstaticvoidmain(String[]args){System.out.println("请输入你的成绩");Scannerin=newScanner(System.in);intscore=in.nextInt();if(score>90){System.out.println("奖励");}else{System.out.println("惩罚&qu

学校要求做ASP的留言管理网页,已经初步构画了页面内容,但是不会代码,求教!!!非常感谢

问题描述 我初步的构思是一个用户留言页面,一个管理员登录页面,一个留言管理页面,用户留言页面和管理员登录页面已经自己搞定了,留言管理页面已经构画好了,但是不知道怎么实现相对应的功能,求代码!!!下面就是页面的设计样式,()里面标注的就是功能代码要求,希望有会的大神能把符合下述页面功能的详细代码回复给我,不胜感激啊!!*页面开始留言管理页面退出(按钮,按下后关闭页面)自动编号姓名性别地址QQ电话留言内容留言时间处理结果操作12345678910查找(按钮+文本框,在文本框内输入要查找的内容,按下后

新手求教,关于java压缩文件的问题

问题描述 新手求教,关于java压缩文件的问题 import java.io.*;import java.util.zip.*;public class Myzip { private void zip(ZipOutputStream outFile fString base) throws Exception{ if(f.isDirectory()){ File f1[]=f.listFiles(); out.putNextEntry(new ZipEntry(base+""/&qu

char数组转换cstring求教

问题描述 char数组转换cstring求教 例如char ch[4]={0x00,0x11,0x22,0x33}怎么转换成cstring输出00112233呢 解决方案 char r[8]; for (int i = 0; i < 4; i++) { r[i * 2] = (char)(ch[i] / 16 + '0'); r[i * 2 + 1] = (char)(ch[i] % 16 + '0'); } CString str = CString(r); 解决方案二: char r[8];

html-CSS里的filter:alpha(opacity=50)是什么意思?求教了,谢谢

问题描述 CSS里的filter:alpha(opacity=50)是什么意思?求教了,谢谢 filter:alpha(opacity=50) 是设置透明度吗 为什么不直接设置成opacity=0.5? alpha是什么? 希望能详细解释一下,非常感谢大家! 解决方案 filter:alpha(opacity=50)是IE专用的属性,因为它不支持opacity属性,为了保证浏览器的兼容性,建议使用时俩个都写. 解决方案二: alpha通道,一个灰度通道,通常表示不同明度. 解决方案三: alph

求解答-C语言51单片机串口通信程序求教

问题描述 C语言51单片机串口通信程序求教 #include #include #include #define INBUF_LEN 4 //数据长度 unsigned char inbuf1[INBUF_LEN]; unsigned char checksum,count3; bit read_flag=0; void init_serialcomm(void) { SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr TMOD