Родительский объект выходит из области видимости, когда я захватил дочернее свойство — когда он распоряжается дочерним свойством?

#c# #.net #asp.net-web-api #asp.net-web-api2 #decoupling

#c# #.net #asp.net-web-api #asp.net-web-api2 #развязка

Вопрос:

Я не совсем уверен, как сформулировать вопрос, но для уточнения я использую AWS SDK в моем 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 метод затем утилизировать весь базовый объект ответа S3, когда фреймворк естественным образом вызывает Dispose взавершение процесса. Не уверен, есть ли лучший способ сделать это.

Комментарии:

1. Я думаю, вам следует использовать PushStreamContent для этого: weblogs.asp.net/andresv /…

2. Да, это было оно, спасибо! @Noseratio добавьте это в качестве ответа, чтобы я мог пометить его как правильный.

Ответ №1:

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

Вот отличный пост в блоге на эту тему с некоторым примером кода: «Асинхронная потоковая передача в ASP.NET WebAPI».

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

Комментарии:

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