处理ASP请求的内部讨论

请求|请求

处理ASP请求

图1说明了一个典型的ASP请求的处理流程。该请求由WAM对象进行初始化处理。该WAM对象再把它发送给ASP-RunTime。ASP-RunTime通过创建一个内部页面对象对其进行响应。

WAM对象是一个自由线程对象。当它调用诸如ASP.DLL的ISAPI扩展时,它使用由IIS-RunTime维护的线程池所分配的MTA模型的线程。

创建ISAPI扩展时面对的一个棘手的问题是,如何处理由这一MTA线程池所带来的线程并发与同步的问题。ASP-RunTime通过在运行ASP脚本前把每个ASP请求切换至一个单线程单元(STA),从而使问题得到简化。ASP-RunTime管理一个独立的STA辅助线程池(在后台,ASP实际上通过使用COM+线程池来实现这一点)。ASP设计师创建了这种线程池方案,以在并发和资源利用之间提供一种优化平衡,同时消除对程序员实现同步的需要。

图 1

图2说明了ASP-RunTime是怎样把每个请求从MTA线程切换到STA线程的。ASP-RunTime调度机制把每个请求都放到一个中央请求队列中。由ASP管理的线程池中的STA线程监视该队列并以先进先出方式处理请求。注意,这一线程池的大小是动态变化的。ASP-RunTime在通信高峰期会产生额外的线程,而在通信较少时释放线程。

图 2

切换到STA线程有效地解决了并发性问题,但是这样对于性能也有明显的影响。在一个单独的MTA线程中队每个请求进行处理的ISAPI扩展DLL都能提供更快的响应时间。

IIS提供了一种方法以对STA线程池和请求队列的最大尺寸进行设置。线程池的大小由IIS元数据库中AspProcessorThreadMax主键控制。该主键的缺省设置是每进程每处理器25(评论:此数字最好能找到微软的相关文档证明一下。有人说这个数目是10个/CPU)。也就是说,在一台四处理器计算机中,每个处理ASP的进程可以最多有100个辅助线程。除非对调整线程池的相关问题已经考虑成熟,否则应该避免改变该键值。注意,你不能使用Internet Server Manager来改变这个设置。必须使用管理脚本或者VB应用来进行修改。

IIS为ASP请求队列设置了一个最大容量。缺省情况下,ASP-RunTime允许队列最多容纳3000个请求(微软的另一篇文档指出,这个队列只能容纳500个请求)。一旦超出,后来进入的ASP请求就会被拒绝,返回错误信息为“Server Too Busy”。

可以使用IIS管理对象和ADSI来编程修改AspProcessorThreadMax主键和AspRequestQueueMax主键。例如,在一个Standard EXE项目中,引用Active DS类型库,编写如下代码:

Dim MyWebServer As ActiveDS.IADs

Set MyWebServer = GetOject(“IIS://Localhost/W3SVC”)

MyWebServer.Put “AspProcessorThreadMax”, 30

MyWebServer.Put “AspRequestQueueMax”, 1500

MyWebServer.SetInfo

下面简单总结一下在单处理器计算机上以缺省方式安装的IIS中,ASP线程池是怎么工作的。该线程池对于每个处理器有25个STA辅助线程可用。当一个请求到达时,就被放到请求队列中,ASP-RunTime从线程池中调度一个空闲STA线程,如果存在一个可用的话(注意,这种方案允许线程池中的任何线程都可以对请求进行处理)。如果没有空闲的辅助线程,请求就加入队列。只要队列没有达到缺省最大容量,所有请求都将得到处理。

来自Ted Pattison的《Programming Distributed Application with Visual Basic 6.0》

时间: 2024-11-03 22:13:36

处理ASP请求的内部讨论的相关文章

浅谈ASP.NET的内部机制(二)

前言:大家知不知道,一个Http Request是如何被传递给ASP.NET的?而且ASP.NET是如何知道一个 Http Request是请求的.aspx这样的动态文件还是请求的.htm这样的静态文件?...... 上次已经说到了http.sys和aspnet_filter的功能,希望大家还记得! 当一个请求(也就是http Request)通过了http.sys和aspnet_fitler后,此时这个请求还没有被传递 给ASP.NET的处理程序.但是此时IIS就会在它的MIME Type中查

asp.net webform相关讨论

问题描述 长期搞c/s架构的企业局域网软件,b/s搞的少,而且在搞webform(木有玩过mvc),也不觉得wpf多好多好,所以讨论围绕webform,请大牛们畅所欲言.1.页面展现列表数据的时候,局部刷新,用的比较多的就是$.ajax调用后台代码或者ashx文件,针对一些数据量较小的列表数据,通常都是用html+css画界面(这种列表展现的数据量较小,不会有翻页.排序的要求).问题来了,如果数据量较大有翻页.排序的要求,再用html+css去自己画页面并实现排序.分页,这个搞起来感觉有点复杂了

ASP请求对象Request

request|对象|请求    当用户通过HTTP访问服务器,要按照一定的输入参数,返回不同的结果,要用到Request对象.      比如:http://localhost/zxg.asp?a=1&b=2     <%          if request("a")=1 and request("b")=2 then                 //处理一些相关的内容                respose.write("s

浅谈ASP.NET的内部机制(一)

前言:当一个Http请求发送给一个aspx页面时,服务器进行了哪些操作?又如何来解析这个请求? ASP.NET在接收请求后是怎么运行的,如怎么编译以及怎么样用托管的代码来运行的?.....理解这些问题 ,使我们可以更加好的开发ASP.NET. 1.当我们在浏览器中请求一个ASP.NET网站的某个页面的时候,如,我们在浏览器中输 入"http://localhost/Demo.aspx",这个请求就被发送到了服务器(当然了,这个网站是部署在IIS中的 ).当请求到达了服务器之后,那么II

IIS 运行ASP文件500内部错误解决方法大全_win服务器

1 IIS服务器出现500错误   2错误原因:500错误的原因一般是源程序出现错误造成的. 3 解决办法:1 首先设置IE浏览器à工具->Internet选项   2 刷新或者重新打开500错误页面就会出现错误的程序部分   3 根据错误提示,然后解决问题.     4 ADODB.Connection 创建失败的可能解决方法: 1.重装MDAC2.8. MDAC 2.8下载地址: http://www.microsoft.com/downloads/details.aspx?displayl

asp HTTP 500 内部服务器错误

我用的vista uitimate系统,安装了IIS后不能运行ASP文件,总是显示----"此错误(HTTP 500 内部服务器错误)意味着您正在访问的网站出现了服务器问题,此问题阻止了该网页的显示." 答: 首先 你把IE 选项里的"显示友好的错误提示"前的勾去掉,看看到底是什么错误. 一般除了程序本身的问题外,服务器的配置也很重要: 1.检查你的数据库文件有写入权限没: 2.看看你的IIS配置是否允许浏览父目录 总之,从程序本身和IIS配置两个方面入手

访问asp页面出现出现“请求的资源在使用中”的解决办法_win服务器

首先解决方法:在Dos命令行状态下分别输入下列命令并按回车(Enter)键: regsvr32 jscript.dll (命令功能:修复Java动态链接库) regsvr32 vbscript.dll (命令功能:修复VB动态链接库) 如果不行再试下面的方法: "内部服务器错误" "请求的资源在使用中"解决办法 [转] 一.出现的问题 windows2003 IIS6运行ASP, http 500 - 内部服务器错误 就是asp程序不能浏览 但htm静态网页不受影响

请求对象错误ASP 0104 : 80004005

请求对象错误 'asp教程 0104 : 80004005′ 症状 上传文件到 windows server + iis 6.0或者iis7.0 服务器的时候遇到下列错误: 请求对象错误 'asp 0104 : 80004005′ 操作被禁止 原因 iis6.0 和iis7禁止上传超过 200kb 的文件. 因此你需要修改 iis 的默认设置. 当然此200k限制仅限无组件上传,如果使用aspupload等上传时不会有此限制. 解决方法 iis6 首先停止 iis 服务,之后打开 c:windo

请求对象错误 &#039;ASP 0104 : 80004005′

症状 上传文件到 windows  server + iis 6.0或者iis7.0 服务器的时候遇到下列错误: 请求对象错误 'asp 0104 : 80004005′ 操作被禁止 原因 iis6.0 和iis7禁止上传超过 200kb 的文件. 因此你需要修改 iis 的默认设置. 当然此200k限制仅限无组件上传,如果使用aspupload等上传时不会有此限制. 解决方法 iis6 首先停止 iis 服务,之后打开 c:windowssystem32inetsrv 中的 metabase.