Мы перенесли проект из WCF в Web API (SelfHost), и во время процесса мы заметили огромный спад при обслуживании веб-приложения. Теперь 40-50 секунд против 3 секунд ранее.
Я воспроизвел проблему в простом консольном приложении, добавив различные Nacet Pacakges для AspNet.WebApi и OwinSelfHost со следующим контроллером:
var stream = new MemoryStream();
using (var file = File.OpenRead(filename))
{
file.CopyTo(stream);
}
stream.Position = 0;
var response = Request.CreateResponse(System.Net.HttpStatusCode.OK);
/// THIS IS FAST
response.Content = new ByteArrayContent(stream.ToArray());
/// THIS IS SLOW
response.Content = new StreamContent(stream);
response.Content.Headers.ContentType = new MediaTypeHeaderValue(System.Web.MimeMapping.GetMimeMapping(filename));
response.Content.Headers.ContentLength = stream.Length;
Как видно из кода, единственным отличием является использование StreamContent (slooooow) и ByteArrayContent.
Приложение размещено на машине Win10 и доступно с моего ноутбука. Fiddler показывает, что для получения одного 1 МБ файла с сервера на мой ноутбук с использованием StreamContent требуется 14 секунд, а ByteArrayContent меньше 1 с.
Также обратите внимание, что полный файл считывается в память, чтобы показать, что единственным отличием является класс содержимого.
Странная вещь заключается в том, что кажется, что ее передача сама по себе медленная. Сервер отвечает на заголовки быстро/немедленно, но для получения данных требуется много времени, как показано в информации о времени Fiddler:
GotResponseHeaders: 07:50:52.800
ServerDoneResponse: 07:51:08.471
Полная информация о времени:
== TIMING INFO ============
ClientConnected: 07:50:52.238
ClientBeginRequest: 07:50:52.238
GotRequestHeaders: 07:50:52.238
ClientDoneRequest: 07:50:52.238
Determine Gateway: 0ms
DNS Lookup: 0ms
TCP/IP Connect: 15ms
HTTPS Handshake: 0ms
ServerConnected: 07:50:52.253
FiddlerBeginRequest:07:50:52.253
ServerGotRequest: 07:50:52.253
ServerBeginResponse:07:50:52.800
GotResponseHeaders: 07:50:52.800
ServerDoneResponse: 07:51:08.471
ClientBeginResponse:07:51:08.471
ClientDoneResponse: 07:51:08.471
Overall Elapsed: 0:00:16.233
Кто-нибудь знает, что происходит под капотом, который может объяснить разницу в поведении?