【问题标题】:IIS Queuing Requests?IIS 排队请求?
【发布时间】:2015-10-27 15:16:59
【问题描述】:

我使用 MvvmCross 和 Stephen Cleary 出色的 AsyncEx 库创建了一个 Windows 10 通用应用程序。

更新 27/10/2015 15:43 - 斯蒂芬已经回答了这个问题。经过测试并证明是正确的。

在视图中,我将 ListView 绑定到 ViewModel 中的一个属性,该属性异步加载称为 AssignableTaskPlaceholderViewModel 的占位符视图模型集合(使用 AsyncEx 功能)。

数据来自我也创建的 Web API 服务。 对于我的测试工具,该集合加载了 12 个 AssignableTaskPlaceholderViewModel,每个仅包含一个 ID 值。

ListView 项的 DataTemplate 然后将元素绑定到 AssignableTaskPlaceholderViewModel 上称为 AssignableTaskViewModel 的属性。这会异步调用另一个 Web API 方法来返回详细数据(再次使用 AsyncEx 功能)。此方法当前正在返回模拟数据。

当我运行应用程序时,我希望看到:

1) 占位符集合的初始加载需要很短的时间,然后

2) 列表中每个项目的详细数据同时加载,加载数据所用的时间大致相同。

我实际看到的是按顺序加载的详细数据,也就是说,IIS 似乎正在对请求进行排队,一次处理一个。

下面显示的是一些调试数据,显示初始请求在一秒钟内处理完毕,响应需要 0 到 4 秒才能完成,即使每个方法调用都在做同样的事情。

我的问题是:为什么会这样?

任务 ID 1050100111000000000034373 开始于 20/10/2015 15:09:52

任务 ID 1050100111000000000034398 于 20/10/2015 15:09:52 开始

任务 ID 1050100111000000000034402 于 20/10/2015 15:09:52 开始

任务 ID 1050100111000000000034407 于 20/10/2015 15:09:52 开始

任务 ID 1050100111000000000034431 于 20/10/2015 15:09:53 开始

任务 ID 1050100111000000000034433 于 20/10/2015 15:09:53 开始

任务 ID 1050100111000000000034454 开始于 20/10/2015 15:09:53

任务 ID 1050100111000000000034479 于 20/10/2015 15:09:53 开始

任务 ID 1050100111000000000034483 于 20/10/2015 15:09:53 开始

任务 ID 1050100111000000000034488 开始于 20/10/2015 15:09:53

任务 ID 1050100111000000000034512 开始于 20/10/2015 15:09:53

任务 ID 1050100111000000000034373 于 20/10/2015 15:09:53 结束

任务 ID 1050100111000000000034514 于 20/10/2015 15:09:53 开始

任务 ID 1050100111000000000034512 于 20/10/2015 15:09:53 结束

任务 ID 1050100111000000000034514 于 20/10/2015 15:09:53 结束

任务 ID 1050100111000000000034402 于 20/10/2015 15:09:53 结束

任务 ID 1050100111000000000034407 于 20/10/2015 15:09:54 结束

任务 ID 1050100111000000000034398 于 20/10/2015 15:09:54 结束

任务 ID 1050100111000000000034483 于 20/10/2015 15:09:55 结束

任务 ID 1050100111000000000034479 于 20/10/2015 15:09:55 结束

任务 ID 1050100111000000000034488 于 20/10/2015 15:09:56 结束

任务 ID 1050100111000000000034454 于 20/10/2015 15:09:56 结束

任务 ID 1050100111000000000034433 于 20/10/2015 15:09:57 结束

任务 ID 1050100111000000000034431 于 20/10/2015 15:09:57 结束

如果我使用假数据(而不是完全调用 Web API 方法),故意增加延迟,我可以看到 View/ViewModel/AsyncEx 管道工作正常。

更多详情:

1) 我正在使用 Windows.Web.Http.HttpClient 调用 Web API。我对所有 Web API 方法调用使用单个 HttpClient 实例(我认为这是最佳实践)。

2) Web API 方法调用不需要身份验证或 HTTPS 连接。

3) 对于 HttpBaseProtocolFilter(用于 HTTPClient),我将 MaxConnectionsPerServer 设置为 100。

4) Web API 项目以 .Net 4.6 (targetFramework="4.6") 为目标。我相信这个版本的 .Net 不会限制与服务器的连接数,即无需将其添加到 web.config:.

5) 我在客户端应用程序和 Web API 方法中“一直”使用 Async/Await。

6) Web API 项目中启用了会话。

7) 我在我的 Win 10 开发 PC 上运行 IIS 10。

【问题讨论】:

  • 最好分享一段repro代码,尤其是这里,因为它涉及到客户端和服务器。 IIS 通常不会对请求进行排队。

标签: c# iis async-await windows-10


【解决方案1】:

如果启用读/写会话模式,则 ASP.NET 将序列化请求。无论它们是同步的还是异步的,ASP.NET 都会这样做。

【讨论】:

  • 非常感谢;删除会话处理解决了这个问题。现在按我的预期工作。
  • @SergRogovtsev:参见the official docs,尤其是“并发请求和会话状态”部分。
  • 非常感谢!序列化是在整个 HTTP 请求级别完成的,还是在Session 访问时完成的?
猜你喜欢
  • 1970-01-01
  • 2011-06-16
  • 2014-10-18
  • 1970-01-01
  • 2023-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多