Выход ASP.NET WebAPI получает 40 × медленнее, когда один байт добавляется к ответу

У меня есть простой способ действия, подобный этому:

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

Время отклика (как заметил Фиддлер):

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, так и в IIS 8.5 (однако порог конкретного ответа немного отличается).

Почему бы так поступить так?


EDIT. В моем случае антивирусом ESET NOD32, проверяющим протокол HTTP, был виновник.

Ответы

Ответ 1

Программное обеспечение AntiVirus сканирует входящие/исходящие данные с вашего ПК.

Они запрограммированы на то, чтобы знать, как понимать данные стандартных типов, и не делать сканы на простых strings ints datatable. Когда вы манипулируете данными напрямую, вы сообщаете антивирусное программное обеспечение "Привет, я странно, пожалуйста, проверьте меня", антивирусные "правила" скрыты, но может быть и другой вид "для размера" и т.д. Это зависит от программного обеспечения. В вашем случае он был медленнее, он должен был выполнять дополнительные задания сканирования, чтобы быть уверенным, что вы в безопасности. Это очень известная проблема в отношении решений Intranet, в которых работают пользовательские приложения, которые отправляют некоторые пользовательские данные.

Ответ 2

Вероятно, вы передаете MTU для сети, и пакеты становятся фрагментированными при передаче по сети. Пакеты на типичной сети превышают 1500, после чего они разделяются.

Попробуйте запустить Wireshark и посмотрите, поможет ли это вам в устранении проблемы. Вы также можете попробовать включить Jumbo Frames на сетевом адаптере и посмотреть, помогает ли это.