Web api вызывает веб-сервис, что приводит к большому времени ожидания (ttfb)
Я работаю над проектом, в котором мы используем внешнего поставщика для предоставления изображений через http (s). Мне нужно создать конечную точку для получения этих изображений, что означает, что у меня есть веб-API, который вызывает веб-сервис и возвращает содержимое.
Я вижу странное поведение, которое не могу объяснить. Всякий раз, когда у меня есть веб-страница (статический html) и я загружаю изображения через свою конечную точку, я, как правило, получаю довольно большое время ожидания (ttfb), но всякий раз, когда я вызываю другую веб-службу напрямую, она реагирует намного меньше, чем ожидание (ttfb) раз я вижу.
Более того, время кажется линейно растущим с количеством статических изображений, которые я размещаю на странице.
Код для моего контроллера выглядит следующим образом (обратите внимание, я удалил некоторые вещи, специфичные для URL).
namespace MediaApi.Controllers
{
public class MediaController : ApiController
{
[Route("api/media/{id}")]
public IHttpActionResult Get(int id)
{
return new FileResult(id);
}
}
public class FileResult : IHttpActionResult
{
private readonly int _id;
public FileResult(int id)
{
if (id == null) throw new ArgumentNullException(nameof(id));
_id = id;
}
public Task<HttpResponseMessage> ExecuteAsync(CancellationToken cancellationToken)
{
return Task.FromResult(GetAsset(_id));
}
private static HttpResponseMessage GetAsset(int id)
{
var ak = "just an accessKey";
var client = new RestClient("some url");
var request = new RestRequest("some request", Method.GET)
{
UseDefaultCredentials = false,
Credentials = null,
Timeout = 3600000,
ReadWriteTimeout = 3600000
};
request.AddParameter("assetid", id);
request.AddParameter("mediaformatid", 50045);
request.AddParameter("destinationid", 10010);
request.AddParameter("accesskey", ak);
Stream stream = new MemoryStream();
request.ResponseWriter = (responseStream) => responseStream.CopyToAsync(stream);
var response = client.Execute(request);
stream.Position = 0;
if (response.StatusCode == HttpStatusCode.OK)
{
var res = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new StreamContent(stream),
StatusCode = HttpStatusCode.OK
};
res.Content.Headers.ContentType = new
MediaTypeHeaderValue("image/jpeg");
res.Content.Headers.ContentLength = stream.Length;
return res;
}
return null;
}
}
}
Также смотрите изображение времени загрузки. Три помеченных вызова напрямую загружаются из веб-службы, а остальные три - через мой контроллер. Обратите внимание на разницу во времени загрузки.
Любые идеи о том, что я могу делать не так?
Заранее спасибо, Магнус