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

时间:2018-12-28 16:26:19

标签: performance iis windows-server-2012-r2

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

对控制器的“ GetRecords”操作进行ajax调用。这样可以非常快速地返回几十条记录的数据。

用户可以对数据进行修改并提交更新。淘汰赛代码再次调用ajax,这次发布记录。此时,该站点“挂起”了很长时间(超过10分钟),但是它确实成功完成了,并且更新的日期一直保存到数据库中。在“挂起时间”内,IIS工作进程的CPU徘徊在50%左右。

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

在页面“挂起”期间,我已从IIS管理器中钻取到“工作进程” \“当前请求”,我可以看到该状态列为“ ExecuteRequestHandler”,并且“模块名称”为“ ManagedPipelineHandler”。没有显示其他“当前请求”。

使用Chrome开发者工具,我捕获了发布用于更新的json,大小约为4mb。

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

此外,当我在开发虚拟机上托管的同一站点上发布相同数量的记录时,它可以正常工作-在3秒内完成端到端的操作。

对我可以采取哪些措施来改善帖子的效果有何建议?

当IIS工作进程处于“挂起”状态时,我已经创建了该进程的转储,可通过以下网址获得:onedrive link

似乎是“线程28”引起的,因为它的“在用户模式下花费的时间”值超过2分钟。我从网站发出http发布请求后大约2分钟就请求进程转储。大约20分钟后,该帖子最终确实完成了

1 个答案:

答案 0 :(得分:0)

能够绕过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);