c# - 直接从流异步上传到 azure

标签 c# azure

我想使用流直接上传到我的 azure 本地开发帐户。我已经为 azure blob 存储创建了一个类。

public class AzureBlob
{
    delegate void UploadFinished(IAsyncResult result);
    public void uploadFile()
    {
        //Initial configuration
        CloudStorage account = CloudStorageAccount.DevelopmentStorageAccount;
        CloudBlobClient client = account.CreateBlobClient();
        CloudBlobContainer container = client.GetContainerReference("myfiles");
        Stream stream = new MemoryStream();

        //Upload to azure
        CloudBlob blob = container.GetBlobReference("sample.txt");
        UploadFinished uploadFinished = delegate(IAsyncResult result)
        {
            Console.WriteLine("Upload finished {0} {1}", result.IsCompleted, stream.Position);
        };
        blob.BeginUploadFromStream(stream, new AsyncCallback(uploadFinished));

        //Write to stream
        for(int i=0;i<100;i++)
        {
            for(int j=0;j<50;j++)
            {
                stream.WriteByte(65);
            }
        }
        stream.Close();


    }
}

我面临的第一个问题是我在存储中获取文件,但它不包含任何数据。即使我在回调中使用 EndOfUploadStream 方法(根据某些 stackoverflow 答案这是一个解决方案)。 其次,我将断点放在回调中,我发现回调在我关闭流之前执行一次,并且程序不断更新流。此时流位置约为 913(大部分是随机的)。 请帮助我直接通过流异步上传 blob。

最佳答案

smarx 的回答很好!另外,将stream.Close()移动到回调中。

delegate void BeginUploadFinished(IAsyncResult result);
public void UploadFile()
{
    //Initial configuration
    var account = CloudStorageAccount.DevelopmentStorageAccount;
    var client = account.CreateCloudBlobClient();
    var container = client.GetContainerReference("myfiles");
    Stream stream = new MemoryStream();
    var state = new Object{};

    //Upload to azure
    var blob = container.GetBlobReference("test.txt");
    BeginUploadFinished beginUploadFinished = delegate(IAsyncResult result)
    {
        blob.EndUploadFromStream(result);
        Trace.WriteLine("EndUploadFromStream", "Information");
        stream.Close();
        stream.Dispose();
    };

    //Write to stream
    Trace.WriteLine("Writing Stream", "Information");
    for (var i = 0; i < 100; i++)
    {
        for (var j = 0; j < 50; j++)
        {
            stream.WriteByte(65);
        }
    }
    stream.Seek(0, SeekOrigin.Begin);

    Trace.WriteLine("BeginUploadFromStream", "Information");
    var _result =  blob.BeginUploadFromStream(stream, new AsyncCallback(beginUploadFinished), state);
    _result.AsyncWaitHandle.WaitOne();
}

关于c# - 直接从流异步上传到 azure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13891497/

相关文章:

c# - SqlDependency notification - 执行查询后立即失败通知

azure - CI/CD/重建 Azure APIM 开发人员门户内容

mysql - 将 Mediawiki 部署到 Azure : no SSL Connection

c# - 使用 System.ComponentModel.DataAnnotations.Validator 验证属性

c# - 类上的扩展方法 - 好主意还是坏主意?

azure - 更新作为参数传递给二头肌文件的对象

git - 在Azure Devops中,从Bitbucket pull 时如何选择yaml管道

azure - Azure AD - 可供其他组织使用的 Multi-Tenancy 应用程序

c# - 设置STS但在webapp中保留formauthentication

c# - 在 C# 中使用热键