【发布时间】:2021-12-31 15:21:14
【问题描述】:
在我的项目中,将项目上传到存储是一个两步过程。
第 1 步 - 我将 blob 上传到 Azure 存储。
第 2 步 - 然后我对 blob 索引标签运行查询并检索 blob 列表(包括我刚刚在第 1 步中上传的那个)
我这样做是因为我正在创建一个文件夹目录系统,用户可以在其中创建自己的文件夹和子文件夹,并且 blob 将被引用到这个文件夹结构。本质上是一种创建与 Windows 文件资源管理器相似的外观和感觉来组织上传的方法。
我必须在步骤 1 和 2 之间考虑几秒钟的短暂延迟,否则如果我尝试在上传完成后立即查询存储,则不会返回新添加的 blob。
我不确定如何最好地解决这个问题,因为在我的代码中的两个步骤之间添加静态延迟似乎是一种危险的方法,以防在某些情况下延迟不够长。
第1步方法:
public async Task UploadContentAsync(UploadContentRequest request)
{
try
{
// Get the BlobContainerClient & Container
var container = _blobServiceClient.GetBlobContainerClient(request.ContainerName);
// Create a container if not exist.
await container.CreateIfNotExistsAsync();
var blobClient = container.GetBlobClient(request.FileName);
var bytes = Encoding.UTF8.GetBytes(request.Content);
await using var memoryStream = new MemoryStream(bytes);
await blobClient.UploadAsync(memoryStream, new BlobHttpHeaders { ContentType = request.FileName.GetContentType() });
if (request.BlobIndexTags != null)
{
// Set or update blob index tags on existing blob
Dictionary<string, string> tags = new()
{
{ "parentFolder", request.BlobIndexTags.ParentFolder }
};
await blobClient.SetTagsAsync(tags);
}
if (request.BlobMetadata != null)
{
IDictionary<string, string> metadata = new Dictionary<string, string>
{
// Add metadata to the dictionary by calling the Add method
{ "description", request.BlobMetadata.Description }
};
// Set the blob's metadata.
await blobClient.SetMetadataAsync(metadata);
}
}
catch (RequestFailedException ex)
{
LogExtension logExtension = new(_config);
string logData = "AzureBlobStorage-API encountered an exception when uploading content with name [" + request.FileName + "]";
logExtension.WriteLogEvent<BlobService>("Error", "Blob Storage", "Upload Content", request.FileName, logData, ex);
throw;
}
}
在上述方法中,我先上传内容(在我的情况下是一个短字符串),然后添加一些索引标签,最后设置一些元数据。
第2步方法:
public async Task<List<TaggedBlobItem>> GetBlobsWithQueryAsync(string query)
{
try
{
var blobs = new List<TaggedBlobItem>();
await foreach (TaggedBlobItem taggedBlobItem in _blobServiceClient.FindBlobsByTagsAsync(query))
{
blobs.Add(taggedBlobItem);
}
return blobs;
}
catch (RequestFailedException ex)
{
LogExtension logExtension = new(_config);
string logData = "AzureBlobStorage-API encountered an exception when fetching blobs with query [" + query + "]";
logExtension.WriteLogEvent<BlobService>("Error", "Blob Storage", "Get Blobs with Query", query, logData, ex);
throw;
}
}
上述方法在第一种方法完成后直接运行。如果我在它们之间添加一个短暂的延迟(当前设置为 2 秒),这两个步骤运行得非常好。
我的问题不是具体的代码,而是更多关于尝试了解在使用 SDK 上传 blob 时是否通常会出现延迟。考虑到我正在等待第 1 步中使用异步 propgramming 完成上传,然后尝试通过第 2 步中的索引标签查询来获取相同的 blob(和其他 blob),我有点困惑。
这两个方法位于我的 API 控制器微服务中,但上传的实际请求是从我的前端应用程序使用 javascript 中的 ajax 驱动的。值得注意的是,在步骤 1 的 API 结果在 ajax 中完成之前,我不会尝试运行方法 2,因此我不相信这个问题会在我的项目中进一步出现。
看来我正在寻找某种等待的 Blob 上传完成事件,例如“Blob 已上传并准备好被查询”
我的猜测是,通过 SDK 完成 blob 的上传实际上并不意味着它已准备好通过查询立即查找和检索,因为 Azure 可能仍在后台处理上传...
【问题讨论】:
标签: c# azure-blob-storage