Http Post - ExecuteRequestHandler 状态下的长时间延迟

Http Post - long delay at state ExecuteRequestHandler

我有一个 asp.net mvc 网站托管在 Windows Server 2012r2 Standard 上,它使用 KnockoutJS 在网格中显示数据。此服务器专用于我遇到问题的进程 - 它不处理任何其他请求。

对控制器的 "GetRecords" 操作进行了 ajax 调用。 returns 几十条记录的数据非常快。

用户可以修改数据并提交更新。淘汰代码进行另一个 ajax 调用,这次 post 记录。此时站点 "hangs" 很长时间(超过 10 分钟),但它确实成功完成并且更新日期已保存到数据库中。在 "hang time" 期间,IIS 工作进程的 CPU 徘徊在 50% 左右。

我正在尝试找出导致延迟的原因。似乎延迟发生在到达控制器操作的第一行代码之前。我在操作中添加了跟踪语句,我可以看到一旦执行了第一行,操作就会在几秒钟内完成。

在IIS manager上,在页面"hung"的时间里,我钻进了"Worker Processes"\"Current Requests",可以看到State列为"ExecuteRequestHandler",模块名称为 "ManagedPipelineHandler"。没有显示其他"Current Requests"。

使用 Chrome 开发工具,我捕获了正在 post 更新的 json,大小约为 4mb。

我已经排除了带宽引起的问题,因为我在本地(在 Web 服务器上)从浏览器 运行 进行了测试,我得到了相同的延迟。

此外,当我 post 在我的开发 VM 上托管的同一站点上有相同数量的记录时,它工作正常 - 在 3 秒内完成端到端。

关于我可以采取的提高 post 性能的步骤的任何建议?

我创建了处于 "hanging" 状态的 IIS 工作进程的进程转储,可在以下位置找到:onedrive link

似乎是 "Thread 28" 导致了这个问题,因为它的 "Time spent in user mode" 值超过了 2 分钟。我在从网站发出 http post 请求后大约 2 分钟请求了进程转储。 post 最终在大约 20 分钟后完成 ok

能够绕过 MVC 模型绑定解决此问题。传递给控制器​​方法的视图模型参数 (editBatchVm) 已被替换。所以,而不是:

public void ResubmitRejectedVouchersAsNewBatch(EditBatchViewModel editBatchVm)
    {

我现在有:

public void ResubmitRejectedVouchersAsNewBatch()
{
    string requestData = "";
    using (var reader = new StreamReader(Request.InputStream))
    {
        requestData = reader.ReadToEnd();
    }
    EditBatchViewModel editBatchVm = JsonConvert.DeserializeObject<EditBatchViewModel>(requestData);