ASP.NET Web API 性能问题

8

我有一个简单的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秒才能返回数据。

enter image description here

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

是否有任何实用工具可以记录ASP.NET HTTP请求处理管道的时间?我的意思是,类似于导航计时,显示每个事件发生的时间?


1
你尝试过 fiddler 吗? - amrswalha
2
我认为你需要缩小它减速的范围。它可能是ASP.NET,也可能是IIS,还可能在网络层下面。你尝试过附加调试器并在函数的第一行设置断点吗?如果没有,请这样做,并查看它是否在4.5秒后或立即调用。4.5秒很长,听起来与网络有关。 - Rocklan
1
@amrswalha,Fiddler在这里无济于事。问题出在服务器上。OP正在谈论ASP.NET HTTP处理管道。 - Saeed Neamati
4个回答

5

你的响应有多大?也许它是序列化和传输的代价?然而,有很多可能性可以对其进行分析,我会从使用市场上的其中一种工具进行分析,比如ANTS Performance ProfilerdotTrace


2
你是否正在使用调试器运行它?请尝试关闭调试器进行测试。 我正在开发一个Web API项目,也遇到了类似的问题,关闭调试器后,测试时间从秒级别降至毫秒级别。 此外,第一次调用API时似乎存在一些启动成本,后续请求会更快。

我们也在没有调试器的情况下运行了测试!即使缓存了加载的文件,从服务器检索数据仍需要大约4-5秒钟,这可能是网络原因,还不确定! - Ali RAN

0

4.5秒是相当长的时间。如果您使用EF,可以使用MiniProfiler.EF。

我曾经因为错误地使用Entity Framework Queryable(将其转换为列表,扩展等)而经历了一些减速(过去)。

如果您正在使用EF,请尽可能保持它为IQueryable(.ToList()执行查询)。

根据您的需求,使用像MiniProfiler、MiniProfiler.Ef和其他建议的工具一样的调试工具也很好(虽然我过去没有使用过它们)。

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


0

尝试使用 Fiddler(http://fiddler2.com/),这是一个免费的 Web 调试工具。它拥有您所寻找的大多数功能。


2
这不是可以通过Fiddler完成的!正如Saeed Neamati在之前的回答中提到的。 - Ali RAN

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接