I am trying to use amazon s3
libs but somehow can't pass stream to upload data to s3
.
At the beginning I was using using
statements but then rewrote it to try catch dispose
and still I can't even dispose the stream, stream is not null but I get exception when trying to dispose that "cannot access closed stream" on the line streamWriter?.Dispose()
;
var memoryStream = new MemoryStream();
var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8);
try
{
try
{
await streamWriter.WriteAsync(commandWithMetadata.SerializeToString());
memoryStream.Seek(0, SeekOrigin.Begin);
var fileName = GetFileName(command);
var request = new PutObjectRequest
{
BucketName = BucketName,
Key = fileName,
InputStream = memoryStream
};
await client.PutObjectAsync(request);
}
finally
{
streamWriter?.Dispose();
}
}
finally
{
memoryStream?.Dispose();
}
CodePudding user response:
Try the following calling await streamWriter.FlushAsync();
before await client.PutObjectAsync(request);
.
But I think better approach would be:
using (var memoryStream = new MemoryStream())
{
using (var streamWriter = new StreamWriter(memoryStream, Encoding.UTF8, leaveOpen: true))
{
await streamWriter.WriteAsync(commandWithMetadata.SerializeToString());
}
memoryStream.Seek(0, SeekOrigin.Begin);
//... send
}
By default StreamWriter
on dispose tries to flush remining data in buffer and close underlying stream (which seems to be already closed by client.PutObjectAsync(request)
) so use leaveOpen: true
. Also there is no need to use try
-finally
-Dispose
(and not fully correctly) - there is using
statement which will do that for you.