我有一个 azure 函数(EventGrid 触发器),当在 blob 存储(Data Lake Storage Gen2)中创建新的 blob 时触发。在这个函数中,我需要读取 blob 并将其反序列化为一个对象(类型已知)。
这是我用来获取 CloudBlob 的方法:
public async Task<CloudBlob> GetCloudBlob(Uri uri)
{
var cloudBlockBlob = new CloudBlob(uri, _storageCredentials);
if (await cloudBlockBlob.ExistsAsync())
return cloudBlockBlob;
return null;
}
使用此代码,我阅读了云 blob
using var stream = await cloudBlob.OpenReadAsync();
await _requestFileHandler.HandleFile(stream, name, prefix, cloudBlob.Uri);
在方法 HandleFile 我调用 DeserializeAsync 方法:
var model = await JsonSerializer.DeserializeAsync<RequestModel>(stream);
由于某种原因,流有时是空的(stream.Length 为 0)导致此异常。
The input does not contain any JSON tokens. Expected the input to start with a valid JSON token, when isFinalBlock is true. Path: $ | LineNumber: 0 | BytePositionInLine: 0.
有趣的是,如果我再次重试这个 blob 的过程,那么流会按预期填充。
我是否缺少任何等待条件,或者 Blob 尚未完全写入存储?