【问题标题】:ASP.NET WebAPI output gets 40× slower when single byte is added to response将单字节添加到响应时,ASP.NET WebAPI 输出会慢 40 倍
【发布时间】:2016-02-15 15:58:59
【问题描述】:

我有一个像这样的简单操作方法:

public class TestApiController : ApiController
{
    [Route("api/string"), HttpGet]
    public string GetString(int length)
    {
         return new string('x', length);
    }
}

响应时间(由 Fiddler 观察):

GET /api/string?length=1186
  0.008
  0.007
  0.007
  ...

GET /api/string?length=1187
  0.208
  0.212
  0.205
  ...

也就是说,通过在响应中添加单个字节,处理时间增加了 40 倍。

这种行为是绝对一致的,我在 Visual Studio 的 Web 服务器和 IIS 8.5 中都观察到它(但是,具体的响应大小阈值略有不同)。

到底为什么会这样?


编辑:就我而言,检查 HTTP 协议的 ESET NOD32 防病毒软件是罪魁祸首。

【问题讨论】:

  • 看起来问题出在您的环境中的某个地方。我已经在我的笔记本电脑上尝试过这种操作方法,对于所有合理的长度(50 - 500000),每次请求总是只需要几毫秒。因此,提供环境详细信息会很有帮助(操作系统、websever、.net 和 asp.net 版本、应用程序和服务器配置)。
  • 除了1186和1187还有其他响应时间差吗?
  • 关闭防病毒并检查。这不是开玩笑,它可能不知道这是什么,并且正在进行更大的扫描
  • 我的猜测是您正在跨越某些数据缓冲区或缓存逻辑的边界。这也可以解释为什么 dev 与 server 中的值不同。为了获得更好的图片,您需要绘制更多数据点。创建越来越大的响应,看看响应时间在初始碰撞后是否会增加。如果是这样,它或多或少是线性的?还是它也跳到其他阈值?如果只有第一次跳转,那么 ASP 可能对您刚刚跨越的“小请求”进行了一些优化。
  • @Sebastian506563 谢谢,没错。关闭防病毒软件解决了这个问题。请添加答案,以便我接受。

标签: asp.net iis asp.net-web-api


【解决方案1】:

防病毒软件正在扫描来自您 PC 的传入/传出数据。

他们被编程知道如何理解具有标准类型的数据,并且不会在简单的strings ints datatable 上进行扫描。当您直接操作这些数据时,您是在告诉给定的防病毒软件“嗨,我很奇怪,请检查我”,防病毒“规则”是隐藏的,但我确定有一些“大小”、“格式”等. 这取决于软件。在您的情况下,它速度较慢,它必须执行额外的扫描作业以确保您的安全。对于运行正在发送一些自定义数据的自定义应用程序的 Intranet 解决方案,这是一个非常知名的问题。

【讨论】:

    【解决方案2】:

    您很可能正在通过网络的 MTU,并且数据包在通过网络时变得碎片化。典型网络上的数据包最多只有不到 1500 个,之后它们会被拆分。

    尝试运行 Wireshark,看看是否可以帮助您找出问题所在。 您也可以尝试在网络适配器上启用巨型帧,看看是否有帮助。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-17
      • 1970-01-01
      • 2019-01-08
      • 2017-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多