Web Api 2控制器和处理程序之间有五秒钟的延迟

时间:2014-10-25 01:20:53

标签: c# entity-framework async-await asp.net-web-api2 dotnet-httpclient

最近,我的Web Api 2 w / Entity Framework 6.1服务器上的Web请求速度急剧下降。向查询数据库的所有请求添加~5000ms。我花了最后三天试图弄清楚我的头发。

设定:

  • Web Api 2.2
  • 实体框架6.1.1
  • IoC的Autofac,DbContext是InstancePerLifetimeScope()以及其他所有内容。
  • 一个自定义HttpParameterBinding,用于从访问令牌中获取实体ID。这会查询db。
  • 只有一个DelegatingHandler,用于记录请求

我做了什么:

  • 预先生成的视图,略有改进
  • 我们查询的实体中的属性减少,没有任何改进
  • 关闭AutoTrackChanges,没有任何改进
  • 在许多请求中尝试过AsNoTracking(),没有任何改进
  • 使用Ant Performance Profiler进行性能分析,没什么用处
  • 使用SQL Management Studio分析数据库,查询都快速

为什么我说处理程序和控制器之间有延迟?我在控制器操作的开始和结束时使用DateTime.Now计时, 1745ms 日志记录处理程序在await base.SendAsync(request,cancellationToken)之前和之后执行一次, 6234ms 。我也对绑定进行了定时,只有2ms。

4489ms 的时间是下落不明的。其他请求有类似的时间。它发生在日志处理程序获取请求并报告之后但绑定开始之前。那里发生了什么?它来自哪里?我们没有任何脱离的异步void方法,我们没有任何应该花费那么长时间的请求操作。完全难倒。

编辑:重复相同的请求不会提高性能。我不相信一个人的表现就是问题,而且一直很差。

1 个答案:

答案 0 :(得分:4)

我很感激帮助,我最终找到了答案。

我们有服务被注入控制器,他们的构造函数正在使用预先加载某些东西的潜在异步调用。将其更改为使用 AsyncLazy 是解决方案。

对类似情况下的人有潜在帮助的步骤,现在列举。

曾经玩过棋盘游戏Guess Who?这与调试非常相似。你想要问打倒一半潜在的问题。不要以&#34开头;这是一种我觉得肮脏的特定方法"而是从以下开始:

  • 什么有效,什么无效?找出差异。那就是你的问题集。
  • 通过一般性问题缩小问题集。找到共同的相似之处并摆脱它们。是异步电话吗? (谢谢评论者)它是像死锁一样的东西吗? (再次感谢)。是首次点击还是初次加载?
  • 一旦您删除了共享的相似之处,就可以开始评论代码了。我把它缩小到一个构造函数,这个构造函数注入了三个对象而没有做任何自己的工作。如果前两个对象不知道我的问题在哪里!