Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/azure/12.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存储上,CanGenerateSasUri总是错误的_C#_Azure_Asp.net Core_Azure Storage_Azure Container Service - Fatal编程技术网

C# 在Azure存储上,CanGenerateSasUri总是错误的

C# 在Azure存储上,CanGenerateSasUri总是错误的,c#,azure,asp.net-core,azure-storage,azure-container-service,C#,Azure,Asp.net Core,Azure Storage,Azure Container Service,我有一个ASP.NETCore3.1WebAPI,它使用Azure存储。 为此,它使用了Microsoft.Azure.Storage.Blob库。 NuGet软件包管理器通知我此软件包已被弃用,我更愿意使用Azure.Storage.Blobs。 我这样做了,并继续修复所有由于此更改而损坏的代码。 在我找到为客户端生成共享访问签名(SAS)的代码之前,我没有遇到很多问题。 无论如何,我通过以下代码成功地实现了这一点: 但是,行urisasuri=containerClient.Generat

我有一个ASP.NETCore3.1WebAPI,它使用Azure存储。 为此,它使用了Microsoft.Azure.Storage.Blob库。 NuGet软件包管理器通知我此软件包已被弃用,我更愿意使用Azure.Storage.Blobs。 我这样做了,并继续修复所有由于此更改而损坏的代码。 在我找到为客户端生成共享访问签名(SAS)的代码之前,我没有遇到很多问题。 无论如何,我通过以下代码成功地实现了这一点:

但是,行
urisasuri=containerClient.GenerateSasUri(sasBuilder)给了我一个错误,经过进一步研究,我改为使用:

StorageSharedKeyCredential credential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);
但是,我还必须注释掉行
if(containerClient.CanGenerateSasUri)
,因为它总是false。显然,这是因为“BlobContainerClient必须使用共享密钥凭据进行授权才能创建服务SAS。”但据我所知,我使用的是共享密钥凭据。我没有使用Azure AD身份验证(尽管我知道这是推荐的mnethod)。我的BlobServiceClient正在进行如下初始化:

string storageConnectionString = $"DefaultEndpointsProtocol=https;AccountName=propworx;AccountKey={storageAccountKey};EndpointSuffix=core.windows.net";
BlobServiceClient blobServiceClient = new BlobServiceClient(storageConnectionString);
有人知道为什么CanGenerateSasUri是假的吗?

必须使用共享密钥凭据授权BlobContainerClient来创建服务SAS。“这意味着您应该直接构建
BlobContainerClient
,而不是使用凭据构建
BlobServiceClient
,然后将其传递给
getservicesauriforcontainer
方法

例如,使用以下代码:

        var storageAccountName = "xxx";
        var storageAccountKey = "xxx";
        var container_name = "xxx";

        StorageSharedKeyCredential credential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);

        //build the blob container url
        string blobcontainer_url = string.Format("https://{0}.blob.core.windows.net/{1}", storageAccountName, container_name);

        //directly build BlobContainerClient, then pass it to GetServiceSasUriForContainer() method
        BlobContainerClient blobContainer = new BlobContainerClient(new Uri(blobcontainer_url), credential);

        Uri mysasuri = GetServiceSasUriForContainer(blobContainer, null);
测试结果:


谢谢,这对我来说效果很好。ms文档不是很清楚您受到了一个bug的影响,它在12.8.0版本的nuget中得到了修复。更多信息:@user963935完全正确,我甚至认为这可能是“答案”,如果不是评论的话。公认的答案解决了问题,但迫使我们使用的凭据超过了我们的需要。如果将Azure.Storage.Blobs包升级到12.8.0(或将Azure.Storage.Files.DataLake升级到12.6.0),则从顶级BlobServiceClient(或系统客户端)创建的每个对象都将继承CanGenerateSasUri的值(true)。
        var storageAccountName = "xxx";
        var storageAccountKey = "xxx";
        var container_name = "xxx";

        StorageSharedKeyCredential credential = new StorageSharedKeyCredential(storageAccountName, storageAccountKey);

        //build the blob container url
        string blobcontainer_url = string.Format("https://{0}.blob.core.windows.net/{1}", storageAccountName, container_name);

        //directly build BlobContainerClient, then pass it to GetServiceSasUriForContainer() method
        BlobContainerClient blobContainer = new BlobContainerClient(new Uri(blobcontainer_url), credential);

        Uri mysasuri = GetServiceSasUriForContainer(blobContainer, null);