Когда я захватил дочернее свойство, родительский объект выходит из области видимости - когда он удаляет дочернее свойство?

1

Я не был уверен, как сформулировать вопрос, но для разработки я использую SDK AWS в своем проекте ASP.Net Web API 2, и я хочу вернуть поток ответов для объекта S3 - поток доставляется на клиент, а затем удаляется.

Я не уверен в том, что мои ссылки на S3 абстрагируются от объекта IFileStore, чтобы отделить себя от AWS как зависимости. Внутри моего хранилища файлов я извлекаю объект S3Response который содержит свойство ResponseStream. Если объект S3Response расположен, он будет располагать базовый ResponseStream. IFileStore только возвращает Stream хотя я затем упаковываю и возвращаю из своего API как StreamContent.

Учитывая, что я вызываю FileStore.GetFile(...) и он возвращает значение свойства ResponseStream а ResponseStream выходит из области видимости, у меня есть подозрение, что Dispose потенциально будет вызван объектом ResponseStream его родителем во время обычного GC до ответа HTTP-ответа.

Как я могу отвлечь S3 и убедиться, что поток ответа удаляется только после завершения ответа HTTP?

Один из способов сделать это - это упаковать весь объект ответа S3 в универсальный контейнерный объект, который реализует Stream как прокси-сервер для базового потока, чтобы затем вернуть StreamContent из моего метода API, а затем Dispose метод Dispose весь основной объект ответа S3, когда среда, естественно, вызывает Dispose в конце процесса. Не уверен, есть ли лучший способ сделать это.

  • 2
    Я думаю, что вы должны использовать PushStreamContent для этого: weblogs.asp.net/andresv/…
  • 1
    Да, это было это, спасибо! @Noseratio добавить это как ответ, чтобы я мог пометить его как правильный.
Теги:
asp.net-web-api
asp.net-web-api2
decoupling

1 ответ

2
Лучший ответ

Может быть хорошей идеей использовать PushStreamContent для потоковой передачи данных клиенту из ASP.NET Web API. PushStreamContent поддерживает асинхронную обработку данных lambda (Func<Task>), и клиент может сразу начать получать поток контента.

Здесь отличный блог на эту тему, с некоторым примером кода: "Асинхронная потоковая передача в ASP.NET WebApi".

Я не могу говорить для AWS SDK, но в идеале вы можете асинхронно передавать данные из потока, возвращаемого AWS API, прямому потоку, отправляемому клиенту вашего веб-API.

  • 1
    Благодарю. Стоит также отметить, что для перекачки из моего исходного потока в целевой поток мне пришлось использовать stream.CopyToAsync. По какой-то причине синхронная версия метода по какой-то причине зашла в тупик.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню