我有一个页面,以下列方式依次对四个Web服务(在IIS服务器上)执行四个异步ajax调用:
executeAjax('/get_parent_List.asmx',blah, blah, blah, successCallBack,errorCallBack);
executeAjax('/get_file_list.asmx',blah, blah, blah, successCallBack2,errorCallBack2);
executeAjax('/get_assigned_to_list.asmx',blah, blah, blah, successCallBack3,errorCallBack3);
executeAjax('/get_comments_list.asmx',blah, blah, blah, successCallBack4,errorCallBack4);
以下是来自java脚本页面的日志。它包括在发送请求之前的时间戳和收到每个请求的响应后的时间戳。
before GET_PARENT_LIST:::::::::::::: 17/05/2018 11:15:39.218
before GET_FILE_LIST:::::::::::::: 17/05/2018 11:15:39.220
before GET_ASSIGNED_TO_LIST:::::::::::::: 17/05/2018 11:15:39.222
before GET_COMMENTS_LIST:::::::::::::: 17/05/2018 11:15:39.224
response of GET_PARENT_LIST:::::::::::::: 17/05/2018 11:15:39.570
response of GET_FILE_LIST:::::::::::::: 17/05/2018 11:15:39.799
response of GET_COMMENTS_LIST:::::::::::::: 17/05/2018 11:15:40.340
response of GET_ASSIGNED_TO_LIST:::::::::::::: 17/05/2018 11:15:40.797
以下是来自webservices的日志:
start of GET_PARENT_LIST:::::::::: 17/05/2018 11:15:39.223
end of GET_PARENT_LIST:::::::::: 17/05/2018 11:15:39.564
start of GET_FILE_LIST:::::::::: 17/05/2018 11:15:39.733
end of GET_FILE_LIST:::::::::: 17/05/2018 11:15:39.791
start of GET_COMMENTS_LIST:::::::::: 17/05/2018 11:15:40.244
end of GET_COMMENTS_LIST:::::::::: 17/05/2018 11:15:40.336
start of GET_ASSIGNED_TO_LIST:::::::::: 17/05/2018 11:15:40.743
end of GET_ASSIGNED_TO_LIST:::::::::: 17/05/2018 11:15:40.793
因此,我在这里有一些问题:
GET_PARENT_LIST的Web服务处理已在 39.564 上完成。下一个webservice(GET_FILE_LIST)的处理从 39.733 开始。为什么在GET_PARENT_LIST完成执行后开始处理GET_FILE_LIST需要花费(733 - 564)169毫秒,即使所有四个ajax调用在第一次GET_PARENT_LIST完成执行时已经被触发了吗?
可以观察到,Web服务的执行方式是,只有在其先前的Web服务完成执行之后才开始执行下一个Web服务。 Web服务是否可以以一种方式运行,一旦它们从ajax调用收到请求就开始执行?
PS:我在本地运行同一端口的页面和服务器。因此请求不是跨浏览器,而是在localhost上运行。
答案 0 :(得分:0)
IIS使用工作线程。每个工作线程负责执行每个线程的请求。如果所有工作线程都已满,则下一个请求必须等待工作线程处于空闲状态才能被处理。
IIS Express的应用程序池中只有一个工作线程。这意味着它将一次执行一个同步调用。其他请求排队。
已更新 - 不推荐。您可以通过更改位于 Documents \ IISExpress \ config \ applicationhost.config 中的 applicationhost.config 来增加工作线程。
搜索 applicationPools 元素。
通过向 add 元素添加 processModel 元素来更改以下内容,以更改所有.NET 4 Web应用程序的应用程序池:
<add name="Clr4IntegratedAppPool" managedRuntimeVersion="v4.0" managedPipelineMode="Integrated" CLRConfigFile="%IIS_USER_HOME%\config\aspnet.config" autoStart="true">
<processModel maxProcesses="10"/>
</add>
更改以下元素中的maxProcesses属性以确定应用程序池的默认值,以更改之后创建的每个应用程序池(可能永远不需要执行此操作)。
<applicationPoolDefaults managedRuntimeLoader="v4.0" >
<processModel maxProcesses="10" />
</applicationPoolDefaults>
您必须重新启动IIS Express服务才有可能生效。这可以通过关闭系统托盘中的IIS或重新启动Visual Studio来完成。
警告:更改配置文件可能会使IIS Express不稳定,因为您正在改变服务的有人参与设计。
要使Web服务异步,您必须使用异步模式。在Web服务上使用异步模式时,每个工作线程每秒最多可以请求30,000个请求。