【问题标题】:ASP.NET Web API performance issueASP.NET Web API 性能问题
【发布时间】:2013-11-12 05:43:03
【问题描述】:

我有一个返回联系人列表的简单 Web API:

public class ContactsApi : ApiController
{
    public List<Contact> GetContacts()
    {
        Stopwatch watch = new Stopwatch();
        watch.Start();
        // Doing some business to get contacts;
        watch.Stop();
        // The operation only takes less than 500 milliseconds
        // returning list of contacts
    }
}

由于我使用Stopwatch 来测试数据检索性能,很明显它只需要不到一秒钟的时间。但是,当我通过 Chrome 浏览器向 GetContacts 操作发出请求时,需要 4 到 5 秒才能返回数据。

显然延迟与我的数据检索代码无关。在我看来,Web API 运行缓慢。但我不知道如何调试和跟踪它。

是否有任何实用程序来记录 ASP.NET HTTP 请求处理管道的时间?我的意思是,像Navigation Timing 这样的东西来表明每个事件发生在什么时间?

【问题讨论】:

  • 你试过fiddler吗?
  • 我认为您需要缩小减速的范围。可能是 ASP.NET,可能是 IIS,可能在网络层。您是否尝试过附加调试器并在函数的第一行放置断点?如果没有,请执行此操作,看看它是在 4.5 秒后还是立即调用。 4.5 秒是很长的时间,听起来和我有关。
  • @amrswalha,提琴手在这里帮不上忙。问题出在服务器上。 OP 正在谈论 ASP.NET HTTP Process Pipeline。

标签: c# asp.net performance asp.net-mvc-4 asp.net-web-api


【解决方案1】:

您的反应有多大?也许这是序列化和传输的成本?但是,有很多可能性来分析它,我会从市场上的一种工具开始分析,比如 ANTS Performance ProfilerdotTrace

【讨论】:

    【解决方案2】:

    您是否使用调试器运行它?在没有调试器的情况下进行一些测试。 我目前正在为我们开发的 Web API 项目遇到了类似的问题 关闭调试器会使测试花费几毫秒而不是几秒。

    第一次调用 API 似乎也有一些启动成本,后续请求总是更快。

    【讨论】:

    • 我们也在没有调试器的情况下运行了测试!即使缓存了加载的文件,从服务器检索数据也需要大约 4 5 秒,可能是网络原因,还不确定!
    【解决方案3】:

    尝试使用免费的网络调试工具 Fiddler (http://fiddler2.com/)。它具有您正在寻找的大部分功能。

    【讨论】:

    • 这不是fiddler能做到的!正如 Saeed Neamati 在之前的回答中提到的那样
    【解决方案4】:

    4.5 秒是相当大的。如果你使用 EF,你可以使用 MiniProfiler.EF

    由于不正确地使用 Entity Framework Queryable(将其转换为列表、扩展......),我经历了一些减速(过去)。

    如果您使用的是 EF,请尽可能长时间保持它为 IQueryable(.ToList() 执行查询)。

    根据您的需要,使用 MiniProfiler、MiniProfiler.Ef 等调试工具和其他建议的工具可能也不错(尽管我过去没有使用过)。

    序列化的成本可能很重要(如果您使用的是 DTO),AutoMapper(可能还有其他工具)在大型列表上似乎很慢。如果您真的想在大列表上获得性能,我建议您在扩展方法中手动映射它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-14
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      相关资源
      最近更新 更多