Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将文件上载到Azure Blob存储后的一小段时间内使用404_C#_Azure - Fatal编程技术网

C# 将文件上载到Azure Blob存储后的一小段时间内使用404

C# 将文件上载到Azure Blob存储后的一小段时间内使用404,c#,azure,C#,Azure,我将附件上载到Azure Blob存储。上传时我还创建了一个SAS令牌;我检索唯一的URL,将其发送到浏览器,并立即打开 当我这样做的时候,我经常(但不是总是)检索到一个404,这个资源不存在。在几秒钟后刷新页面时,将正确检索该页面 所以我上传附件后似乎“太快了”。有没有办法等到Azure准备好提供附件?我本以为等待电话就足以实现这一目标 public async void UploadFile(string filename, byte[] filecontent) { var con

我将附件上载到Azure Blob存储。上传时我还创建了一个SAS令牌;我检索唯一的URL,将其发送到浏览器,并立即打开

当我这样做的时候,我经常(但不是总是)检索到一个404,这个资源不存在。在几秒钟后刷新页面时,将正确检索该页面

所以我上传附件后似乎“太快了”。有没有办法等到Azure准备好提供附件?我本以为等待电话就足以实现这一目标

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…”。我认为您必须等待所有异步操作。这只意味着,在该上下文中等待它。不在调用上下文中。