我编写了一个小的控制台应用程序,将本地计算机上的文件夹中的文件上传到Azure blob存储,我的问题是代码可以编译并运行而没有错误,但是我没有得到预期的结果。
我希望将FolderPath中的所有文件上载到容器,并且如果不存在创建它的IF容器,但是它永远不会被创建,并且控制台告诉我所有内容都已上传。那时我对代码的期望可能不正确。
using System;
using System.IO;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage.Blob.Protocol;
namespace AzureBlobs
{
class Program
{
const string StorageAccountName = "cs72e88a177daeax40edxbf2";
const string StorageAccountKey = "[ACCOUNT KEY]";
const string FolderPath = @"[LOCAL FILE PATH]";
static void Main()
{
var storageAccount = new CloudStorageAccount(new StorageCredentials(StorageAccountName, StorageAccountKey), true);
var blobclient = storageAccount.CreateCloudBlobClient();
var container = blobclient.GetContainerReference("newcontainer");
container.CreateIfNotExistsAsync();
container.SetPermissionsAsync(new BlobContainerPermissions()
{
PublicAccess = BlobContainerPublicAccessType.Blob
});
foreach( var filePath in Directory.GetFiles(FolderPath, "*.*", SearchOption.AllDirectories))
{
var blob = container.GetBlockBlobReference(filePath);
blob.UploadFromFileAsync(filePath);
Console.WriteLine("Uploaded {0}", filePath);
}
Console.WriteLine("Donzos!");
}
}
}
答案 0 :(得分:1)
问题在于,您正在调用的大多数Azure SDK方法都是 async ,但您不是正在等待。因此,它们基本上都是生死攸关。
答案 1 :(得分:0)
我创建了一个控制台应用程序,并且一切正常,您可以检查代码(我使用的软件包为Microsoft.Azure.Storage.Blob
)
using Microsoft.Azure.Storage;
using Microsoft.Azure.Storage.Blob;
using System;
using System.IO;
namespace uploadFilesToStorage
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Lets start upload files to Azure Storage!");
string folderpath = @"C:\Users\bowmanzh\Pictures\images";
var storageAccount = CloudStorageAccount
.Parse("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
var myClient = storageAccount.CreateCloudBlobClient();
var container = myClient.GetContainerReference("case");
foreach (var filepath in Directory.GetFiles(folderpath,"*.*",SearchOption.AllDirectories)) {
var blockBlob = container.GetBlockBlobReference(filepath);
blockBlob.UploadFromFileAsync(filepath);
}
Console.ReadLine();
}
}
}
注释:
WindowsAzure.Storage
(最新版本为v9.3.2)是我们一直使用的旧版Storage SDK,而Microsoft.Azure.Storage.*
(最新版本v11.1.0)是其新版本。
检查Storage .NET SDK的更改日志。列出这些重要差异/更改的一部分。
Microsoft.Azure.Storage
将库分为Blob,Queue和File三个部分,这意味着我们可以安装单独的软件包而不是完整版本。
Microsoft.Azure.Storage
不支持Table API,它已传输到Microsoft.Azure.Cosmos.Table
。
Microsoft.Azure.Storage
从9.4.0-preview开始增加了NetStandard2.0目标支持,该支持支持包装在异步API上的同步方法。 NetStandard上的WindowsAzure.Storage
仅具有异步API。
答案 2 :(得分:0)
您使用的API错误。您必须> -1
所有返回await
的API方法。第一步是使您的Task
方法Main
(这是C#7.1的功能)。
async
(要使用static async Task Main()
,您还需要在源文件的顶部添加Task
。)
接下来,您需要using System.Threading.Tasks;
所有异步方法:
await
成为
container.CreateIfNotExistsAsync();
这意味着您的代码将仅在创建容器之后继续执行。如果没有await container.CreateIfNotExistsAsync();
,您的代码会将API请求发送到Azure,但立即继续执行而无需等待Azure完成请求。
您还必须等待await
和container.SetPermissionsAsync
。但是,如果您忘记在另一个blob.UploadFromFileAsync
方法中使用await
方法async
(在您的情况下为async
),则会收到编译器警告,因此您应该注意是否出错