Azure 文件存储创建文件 404 错误

Azure File Storage Create File 404 Error

我有以下代码试图在我的 Azure 文件存储帐户上创建一个空白文件

CloudStorageAccount sa = CloudStorageAccount.Parse(connectionString);
var fc = sa.CreateCloudFileClient();
var share = fc.GetShareReference("uploadparking");
share.CreateIfNotExists();
var rootDirectory = share.GetRootDirectoryReference();
var subDirectory = rootDirectory.GetDirectoryReference("valuationrequests");
subDirectory.CreateIfNotExists();
var uri = new Uri(subDirectory.Uri.ToString() + "/file.txt");
var file = new CloudFile(uri);
file.Create(0);

在最后一行出现以下异常:

Microsoft.WindowsAzure.Storage.StorageException' occurred in Microsoft.WindowsAzure.Storage.dll

Additional information: The remote server returned an error: (404) Not Found.

我不确定它找不到什么。它不应该在创建文件时尝试查找文件。我已确认目录存在。

如果有人知道我可以成功创建文件,请告诉我。我已经查看了教程,遗憾的是它们只显示了如何下载文件而不是上传文件。

我认为文档不正确。文档只提到 URI 应该是绝对的。它没有提到如果您使用的是绝对 URI,那么您还应该传递存储凭据,或者 URI 应该包含共享访问签名,并且至少具有 Create 创建文件的权限。

您应该尝试使用以下 CloudFile 覆盖来创建实例:https://docs.microsoft.com/en-us/dotnet/api/microsoft.windowsazure.storage.file.cloudfile.-ctor?view=azurestorage-8.1.3#Microsoft_WindowsAzure_Storage_File_CloudFile__ctor_System_Uri_Microsoft_WindowsAzure_Storage_Auth_StorageCredentials_.

因此您的代码将是:

CloudStorageAccount sa = CloudStorageAccount.Parse(connectionString);
var fc = sa.CreateCloudFileClient();
var share = fc.GetShareReference("uploadparking");
share.CreateIfNotExists();
var rootDirectory = share.GetRootDirectoryReference();
var subDirectory = rootDirectory.GetDirectoryReference("valuationrequests");
subDirectory.CreateIfNotExists();
var uri = new Uri(subDirectory.Uri.ToString() + "/file.txt");
var file = new CloudFile(uri, sa.Credentials);
file.Create(0);

其他替代方法是在共享上创建一个 Shared Access Signature (SAS) 令牌,并在创建 CloudFile 实例时使用 SAS URL。所以在这种情况下,您的代码将是:

CloudStorageAccount sa = CloudStorageAccount.Parse(connectionString);
        var fc = account.CreateCloudFileClient();
        var share = fc.GetShareReference("uploadparking");
        share.CreateIfNotExists();
        var rootDirectory = share.GetRootDirectoryReference();
        var subDirectory = rootDirectory.GetDirectoryReference("valuationrequests");
        subDirectory.CreateIfNotExists();
        SharedAccessFilePolicy policy = new SharedAccessFilePolicy()
        {
            Permissions = SharedAccessFilePermissions.Create,
            SharedAccessExpiryTime = DateTime.UtcNow.AddMinutes(15)
        };
        var sasToken = share.GetSharedAccessSignature(policy);
        var uri = new Uri(subDirectory.Uri.ToString() + "/file1.txt" + sasToken);
        var file = new CloudFile(uri);
        file.Create(0);