C# 将文件上载到Azure Blob存储后的一小段时间内使用404
我将附件上载到Azure Blob存储。上传时我还创建了一个SAS令牌;我检索唯一的URL,将其发送到浏览器,并立即打开 当我这样做的时候,我经常(但不是总是)检索到一个404,这个资源不存在。在几秒钟后刷新页面时,将正确检索该页面 所以我上传附件后似乎“太快了”。有没有办法等到Azure准备好提供附件?我本以为等待电话就足以实现这一目标C# 将文件上载到Azure Blob存储后的一小段时间内使用404,c#,azure,C#,Azure,我将附件上载到Azure Blob存储。上传时我还创建了一个SAS令牌;我检索唯一的URL,将其发送到浏览器,并立即打开 当我这样做的时候,我经常(但不是总是)检索到一个404,这个资源不存在。在几秒钟后刷新页面时,将正确检索该页面 所以我上传附件后似乎“太快了”。有没有办法等到Azure准备好提供附件?我本以为等待电话就足以实现这一目标 public async void UploadFile(string filename, byte[] filecontent) { var con
public async void UploadFile(string filename, byte[] filecontent)
{
var containerClient = _blobServiceclient.GetBlobContainerClient("attachments");
var blobClient = containerClient.GetBlobClient(filename);
using (var stream = new MemoryStream(filecontent))
{
await blobClient.UploadAsync(stream, new BlobHttpHeaders { ContentType = GetContentTypeByFilename(filename) });
}
}
public async Task<string> GetLinkForFile(string filename)
{
var containerClient = _blobServiceclient.GetBlobContainerClient("attachments");
var sasBuilder = new BlobSasBuilder()
{
BlobContainerName = containerName,
BlobName = filename,
Resource = "b",
StartsOn = DateTime.UtcNow.AddMinutes(-1),
ExpiresOn = DateTime.UtcNow.AddMinutes(5),
};
// Specify read permissions
sasBuilder.SetPermissions(BlobSasPermissions.Read);
var credentials = new StorageSharedKeyCredential(_blobServiceclient.AccountName, _accountKey);
var sasToken = sasBuilder.ToSasQueryParameters(credentials);
// Construct the full URI, including the SAS token.
UriBuilder fullUri = new UriBuilder()
{
Scheme = "https",
Host = string.Format("{0}.blob.core.windows.net", _blobServiceclient.AccountName),
Path = string.Format("{0}/{1}", containerName, filename),
Query = sasToken.ToString()
};
return fullUri.ToString();
}
public async Task<Document> GetInvoice(byte[] invoiceContent, string invoiceFilename)
{
string filePath = await GetLinkForFile(invoiceFilename);
UploadFile(invoiceFilename, file);
return new Document()
{
Url = filePath
};
}
public async void上传文件(字符串文件名,字节[]filecontent)
{
var containerClient=_blobServiceclient.GetBlobContainerClient(“附件”);
var blobClient=containerClient.GetBlobClient(文件名);
使用(变量流=新内存流(文件内容))
{
等待blobClient.UploadAsync(流,新BlobHttpHeader{ContentType=GetContentTypeByFilename(filename)});
}
}
公共异步任务GetLinkForFile(字符串文件名)
{
var containerClient=_blobServiceclient.GetBlobContainerClient(“附件”);
var sasBuilder=new BlobSasBuilder()
{
BlobContainerName=containerName,
BlobName=filename,
Resource=“b”,
StartsOn=DateTime.UtcNow.AddMinutes(-1),
ExpiresOn=DateTime.UtcNow.AddMinutes(5),
};
//指定读取权限
SetPermissions(BlobSasPermissions.Read);
var credentials=新的StorageSharedKeyCredential(_blobServiceclient.AccountName,_accountKey);
var sasToken=sasBuilder.ToSasQueryParameters(凭证);
//构造完整的URI,包括SAS令牌。
UriBuilder fullUri=新的UriBuilder()
{
Scheme=“https”,
Host=string.Format(“{0}.blob.core.windows.net”,_blobServiceclient.AccountName),
Path=string.Format(“{0}/{1}”,containerName,filename),
Query=sasToken.ToString()
};
返回fullUri.ToString();
}
公共异步任务GetInvoice(字节[]invoiceContent,字符串invoiceFilename)
{
字符串filePath=await GetLinkForFile(invoiceFilename);
上传文件(invoiceFilename,文件);
返回新文档()
{
Url=文件路径
};
}
REST调用方法
GetInvoice
,并将响应(包含URL)返回到打开它的浏览器。如果您注意到,您不会在此处等待上载操作完成:
_azureStorageRepository.UploadFile(invoiceFilename, file);
请将此更改为:
await _azureStorageRepository.UploadFile(invoiceFilename, file);
您不应该看到404错误。Azure Blob存储具有强一致性
另外,将
UploadFile
方法从public async void UploadFile
更改为public async Task UploadFile
,如@Fildor在评论中所述。这可能是因为您没有等待上载操作完成。public async void UploadFile(字符串文件名,字节[]filecontent)
可能也应该是公共异步任务…
,但里面有“wait blobclient.upload…”。我认为您必须等待所有异步操作。这只意味着,在该上下文中等待它。不在调用上下文中。