Azure 为什么BlobClient.UploadAsync在通过内存流上载JSON时挂起?
我正试图通过内存流将JSON上传到Azure blob。当我调用UploadAsync时,我的应用程序挂起。如果将UploadAsync调用移到StreamWriter花括号之外,则会得到System.ObjectDisposedException:“无法访问封闭流。”异常。如何将JSON流式传输到blobAzure 为什么BlobClient.UploadAsync在通过内存流上载JSON时挂起?,azure,json.net,blob,azure-storage-blobs,memorystream,Azure,Json.net,Blob,Azure Storage Blobs,Memorystream,我正试图通过内存流将JSON上传到Azure blob。当我调用UploadAsync时,我的应用程序挂起。如果将UploadAsync调用移到StreamWriter花括号之外,则会得到System.ObjectDisposedException:“无法访问封闭流。”异常。如何将JSON流式传输到blob var blobClient = new BlobClient(new Uri(storageUri), options); var ser
var blobClient = new BlobClient(new Uri(storageUri), options);
var serializer = JsonSerializer.Create(this.serializerSettings);
using (var stream = new MemoryStream())
{
using (var writer = new StreamWriter(stream))
{
serializer.Serialize(writer, job);
await blobClient.UploadAsync(stream, overwrite: true, cancellationToken: cancellationToken);
}
}
我使用了leaveOpen选项来保持内存流的打开。在上传到blob之前,我还对内存流进行了重绕
var blobClient = new BlobClient(new Uri(storageUri), options);
var serializer = JsonSerializer.Create(this.serializerSettings);
using (var stream = new MemoryStream())
{
// Use the 'leave open' option to keep the memory stream open after the stream writer is disposed
using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
{
// Serialize the job to the StreamWriter
serializer.Serialize(writer, job);
}
// Rewind the stream to the beginning
stream.Position = 0;
// Upload the job via the stream
await blobClient.UploadAsync(stream, overwrite: true, cancellationToken: cancellationToken);
}
我使用了leaveOpen选项来保持内存流的打开。在上传到blob之前,我还对内存流进行了重绕
var blobClient = new BlobClient(new Uri(storageUri), options);
var serializer = JsonSerializer.Create(this.serializerSettings);
using (var stream = new MemoryStream())
{
// Use the 'leave open' option to keep the memory stream open after the stream writer is disposed
using (var writer = new StreamWriter(stream, Encoding.UTF8, 1024, true))
{
// Serialize the job to the StreamWriter
serializer.Serialize(writer, job);
}
// Rewind the stream to the beginning
stream.Position = 0;
// Upload the job via the stream
await blobClient.UploadAsync(stream, overwrite: true, cancellationToken: cancellationToken);
}
1) 序列化后,您需要刷新
StreamWriter
,理想的方法是使用语句将其放入中,而不是关闭底层流(请参阅)。2) 上传前,您需要通过设置stream.Position=0来倒带MemoryStream
。不知道这些是不是导致绞死的原因。看起来这是和的复制品。确切地表明该做什么。同意吗?谢谢你的回复。我看了那篇文章,但它没有显示正在刷新的流。通过using
语句处理StreamWriter
会刷新它。链接的答案显示了如何在不关闭基础流的情况下执行此操作。谢谢,我已使用链接的答案更新了我的答案。1)序列化后,您需要刷新StreamWriter
,最好是使用语句将其放置在中,而不关闭基础流(请参阅)。2) 上传前,您需要通过设置stream.Position=0来倒带MemoryStream
。不知道这些是不是导致绞死的原因。看起来这是和的复制品。确切地表明该做什么。同意吗?谢谢你的回复。我看了那篇文章,但它没有显示正在刷新的流。通过using
语句处理StreamWriter
会刷新它。链接答案显示了如何在不关闭底层流的情况下完成此操作。谢谢,我已使用链接答案更新了我的答案。