#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 . По какой-то причине синхронная версия метода, похоже, заблокирована внутри.