来自新设备的 ASP.NET 第一个请求很慢 [关闭]
Posted
技术标签:
【中文标题】来自新设备的 ASP.NET 第一个请求很慢 [关闭]【英文标题】:ASP.NET First request from a new device is slow [closed] 【发布时间】:2021-12-03 09:50:34 【问题描述】:我遇到了一个问题,即对我的 ASP.net API 的第一个请求很慢。
因此,它不是第一个发出请求的用户,而是从任何设备到服务器的第一个请求很慢。一旦该设备发出了第一个请求,那么该设备的其余请求将在一天的剩余时间内快速进行,直到第二天。一旦到了新的一天,设备的第一次请求又很慢。
我不认为这是服务器在休眠,因为就像我上面所说的,这是来自每个设备的第一个请求。
为了清楚起见,举个例子。
如果我在计算机上向 API 发出请求,我的第一个请求会很慢。 如果我旁边的另一个人向同一个 API 发出请求,即使我先发出请求(基本上是唤醒服务器),他/她的第一个请求也会很慢。
另一件事是,当我在本地机器上测试 API 时也会发生这种情况。第一个请求大约是 18 秒,然后如果我在本地重新启动它,那么第一个请求又很慢。
有人对正在发生的事情有任何想法吗?
.Net 框架 4.6.1 我们也使用 Azure。
【问题讨论】:
可能重复:***.com/questions/13386471/… 我想您是从 Web 应用程序发送请求?如果是这样,请使用浏览器控制台并查看网络监视器面板中的时序选项卡。您可以在此处找到有关网络请求的每个阶段所用时间的信息,并提供更详细的信息。它可以帮助定位瓶颈。 @1_bug 我使用网络监控工具查看发生了什么我看到的是请求时间不到一秒但等待(TTFB)大约需要 16 秒 @Jazb 我见过这样的问题,但我不确定它是否相同,因为他们说这是第一个用户请求。我的情况适用于每一种新设备(我想你可以说每一种新用途)。服务器也不睡觉。我们在 Azur 服务上设置了永远在线功能,以尝试阻止 API 休眠。 【参考方案1】:设备很可能在预检期间限定域并缓存标头。这对于大多数 Web API 来说是正常的。客户端缓存有关连接的详细信息,以便使将来的请求更快。您还可以考虑对您的请求进行 gzip 压缩以压缩您的有效负载。
我发现 .net 4 web api 在发出第一个请求时比 .net core 运行得慢。但是.net core 有时也需要 5-6 秒
【讨论】:
是的,获取域确实需要更长的时间,但就像我对@1_bug 说的那样,等待(TTFB)是最耗时的 您使用什么浏览器进行测试?它在 Insomnia 或 Postman 中的表现如何? 我正在使用谷歌浏览器。我对失眠不熟悉,但在邮递员上我得到了相同的结果。当使用 react-native 应用程序时,我也得到了相同的结果。 在 chrome 上预检需要多长时间 我不确定您所说的预检是什么意思?【参考方案2】:不知道您的应用程序可能有很多原因。一个原因可能是您在客户端的缓存中存储了一个相当大的对象。对 API 的第一个请求可能会要求提供所有信息以填充此模型(整体),这可能非常大。在客户端对请求的对象进行反序列化后,后续请求的有效负载大小可能会小得多,仅用于更新客户端的模型。因此,后续请求更快的原因。会话结束并在客户端重新启动(例如通过关闭浏览器)后,客户端缓存被清除,模型需要再次加载,这可能是您总是观察到长时间加载的原因第一个请求。
这里可能的解决方案是:
-
调查是否可以通过删除冗余信息/属性来减少服务器和客户端之间的初始负载(通常是 json 字符串)。
如果您可以访问 API 的源代码,请查看是否可以使用某些压缩器来压缩来自服务器的数据。 (例如https://docs.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-5.0)
根据您提供的信息,这只是推测,但可能需要调查。
【讨论】:
我不认为它是客户端。 Waiting(TTFB) 来自我读过的内容,Time Till First Byte 对我来说意味着这是客户端等待服务器响应的时间。我很可能错了,但这只是我的理解。 是的。它可能是。正如我所说,这只是我的猜测。你知道你的第一个请求的字符串有多大吗? 好吧,我明白了。第一个请求通常是一个登录请求,它的用户名和密码只有几 kb。以上是关于来自新设备的 ASP.NET 第一个请求很慢 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章