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;                 
    }
  }
}

Также смотрите изображение времени загрузки. Три помеченных вызова напрямую загружаются из веб-службы, а остальные три - через мой контроллер. Обратите внимание на разницу во времени загрузки.

Любые идеи о том, что я могу делать не так?

Заранее спасибо, Магнус

0 ответов

Другие вопросы по тегам