Выход 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 на сетевом адаптере и посмотреть, помогает ли это.