【问题标题】:Azure Storage api doesn't work for asnyc uploadsAzure 存储 api 不适用于异步上传
【发布时间】:2014-07-17 11:57:43
【问题描述】:

我正在尝试通过 Azure Blob Storage .NET api 上传这么多文件,并与当前最新版本 4.0.1 一起使用。在 ASP.NET MVC 应用程序中,我使用异步操作方法通过 await blobFile.UploadFromStreamAsync 上传,但它确实不起作用,甚至我没有看到异常。它在没有成功的情况下默默地停止。

但是,如果我将操作方法​​更改为非异步并通过 blobFile.UploadFromStream 方法上传,那么一切正常。我可能会以 1% 的成功率通过异步方式上传,这意味着稳定性非常低。

你有同样的经历吗?是 Storage Api 实现中的错误吗?

这是一个简短的例子。一种是异步的,另一种是非异步操作方法。如果我上传小文件没有任何问题,但在大下载时出现问题。在这个例子中 UploadBlobSec 方法上传时间很短,但 UploadBlob 需要无限时间。

    public async Task UploadBlob()
    {
        var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ConnectionString);
        var blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference("files");
        var blobFile = blobContainer.GetBlockBlobReference("song.mp3");

        using (var stream = new WebClient().OpenRead("http://apolyonstorage.blob.core.windows.net/files/e8b1a1fa-8791-44dc-92ce-1a67a62f7b0f.mp3"))
        {
            await blobFile.UploadFromStreamAsync(stream);
        }
    }

    public void UploadBlobSec()
    {
        var storageAccount = CloudStorageAccount.Parse(ConfigurationManager.ConnectionStrings["AzureStorage"].ConnectionString);
        var blobContainer = storageAccount.CreateCloudBlobClient().GetContainerReference("files");
        var blobFile = blobContainer.GetBlockBlobReference("song.mp3");

        using (var stream = new WebClient().OpenRead("http://apolyonstorage.blob.core.windows.net/files/e8b1a1fa-8791-44dc-92ce-1a67a62f7b0f.mp3"))
        {
            blobFile.UploadFromStream(stream);
        }
    }

【问题讨论】:

  • @usr 你不能确定这一点。我与我自己的代码无关。如果我不喜欢异步上传,一切正常。
  • 拜托,我是经验丰富的开发人员,我不会怀疑这可能是 api 中的错误。我不认为数千名开发人员使用的异步上传方式。它比你想象的要少得多。
  • 我很快就会在这里提供经过简化和测试的示例。
  • @usr 如果你有时间,你能测试一下这个例子吗?我相信你会遇到同样的问题。
  • 代码看起来不错。这所有是怎么回事?也许调用者正在对UploadBlob 返回的任务调用Wait。这是一种常见的僵局情况。该问题是否在带有异步控制器的全新、几乎为空的 ASP.NET MVC 应用程序中重现?如果是,那确实看起来像一个错误。但我认为不会,因为这意味着这种方法 100% 不可用。那早就找到了。

标签: asp.net-mvc asp.net-mvc-4 azure azure-storage azure-blob-storage


【解决方案1】:

代码 sn-p 看起来不错 - 尽管我不确定它周围的应用程序在做什么。您是否打开了服务器日志以查看服务器端发生了什么?对于大文件,您应该看到异步上传转换为几个 PutBlocks,然后是一个 PutBlockList。如果您没有看到 PutBlockList,则可能是您的应用程序中发生了一些奇怪的事情。

然后假设您确实在服务器日志中看到了操作,这显然意味着操作正在发生。那时,看看 E2ELatency 数字与 ServerLatency,我认为您会发现 E2Latency 有很大的不同,因为它包含了客户端花费的时间 - 看看您的客户端网络是否可能导致问题会很有趣。例如,在我的连接中,第一个 PutBlock 上的 e2elatency 为 1346 毫秒,而 ServerLatency 为 137。

有关日志记录的更多信息,请查看here

杰森

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-10-10
    • 2012-06-08
    • 2016-10-02
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多