Я не был уверен, как сформулировать вопрос, но для разработки я использую 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 в конце процесса. Не уверен, есть ли лучший способ сделать это.
Может быть хорошей идеей использовать PushStreamContent
для потоковой передачи данных клиенту из ASP.NET Web API. PushStreamContent
поддерживает асинхронную обработку данных lambda (Func<Task>
), и клиент может сразу начать получать поток контента.
Здесь отличный блог на эту тему, с некоторым примером кода: "Асинхронная потоковая передача в ASP.NET WebApi".
Я не могу говорить для AWS SDK, но в идеале вы можете асинхронно передавать данные из потока, возвращаемого AWS API, прямому потоку, отправляемому клиенту вашего веб-API.
PushStreamContent
для этого: weblogs.asp.net/andresv/…