如何在IIS服务器上同时运行多个请求?

时间:2018-05-16 23:47:33

标签: c# ajax asynchronous iis asmx

我有一个页面,以下列方式依次对四个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

因此,我在这里有一些问题:

  1. 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完成执行时已经被触发了吗?

  2. 可以观察到,Web服务的执行方式是,只有在其先前的Web服务完成执行之后才开始执行下一个Web服务。 Web服务是否可以以一种方式运行,一旦它们从ajax调用收到请求就开始执行?

    • 从javascript和webservice的日志中可以看出,GET_FILE_LIST的AJAX调用是在 39.220 上触发的,但它在webservice中的执行仅在 39.791 上启动。即几乎在 571 毫秒之后。我希望在激活AJAX请求后立即启动GET_FILE_LIST的webservice执行。
  3. PS:我在本地运行同一端口的页面和服务器。因此请求不是跨浏览器,而是在localhost上运行。

1 个答案:

答案 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个请求。