【问题标题】:HttpClient.GetAsync( ) & CloudBlobBlock.UploadFromStreamAsync( ) - how is this executed?HttpClient.GetAsync( ) & CloudBlobBlock.UploadFromStreamAsync( ) - 这是如何执行的?
【发布时间】:2016-06-25 09:01:04
【问题描述】:

我需要从一个地方下载一个文件,然后将它上传到一个 azure blob。完成后我还需要返回 blob 的大小:

public async Task<Stream> Download(string url)
{
   using (var client = new HttpClient())
   {
        return await client.GetStreamAsync(url);
   }
}

public async Task<long> Upload(Stream stream, string filename) 
{
   var container = GetBlobContainer(..);
   var blob = container.GetBlockBlobReference(filename);

   await blob.UploadFromStreamAsync(stream);
   blob.FetchAttributes();

   return blob.Properties.Length;
}

public async Task<long> Action()
{
   var stream = await Download("https://.....");
   var size = await Upload(stream, "newfile.dat");

   return size;
}

问题

  • 在完整的流下载到内存之前会调用Upload方法吗?

  • Upload 是否会在 HttpClient 开始接收字节后立即开始将字节上传到 azure?

  • 如果没有 - 是否可以这样做?

奖励:

  • 将生成多少种不同的上下文?是否应该使用.ConfigureAwait(false) 来限制上下文切换?

  • blob.FetchAttributes() 是获取 blob 大小的正确方法吗?

【问题讨论】:

    标签: .net async-await azure-blob-storage dotnet-httpclient


    【解决方案1】:

    会在完整的流下载到内存之前调用 Upload 方法吗?

    不,因此默认情况下 HttpClient 会将整个响应下载到内存中,然后 然后 为您提供流。请参阅:HttpClient.SendAsync。您使用的重载指定了HttpCompletionOption.ResponseContentRead。但更糟糕的是,您的代码不起作用,您在使用流之前处理了HttpClient,这应该会导致流被关闭。

    HttpClient 开始接收字节后,Upload 是否会开始将字节上传到 azure?

    再次,不,请参阅上一个答案。

    如果没有 - 是否有可能做到这一点?

    是的,使用我之前列出的SendAsync 重载并设置适当的HttpCompletionOption,哦,并修复我提到的那个处置问题。 :)

    将生成多少种不同的上下文?是否应该使用 .ConfigureAwait(false) 来限制上下文切换?

    不确定您所说的“conetxts”是什么意思,我假设执行上下文?如果没有看到更多代码,这很难说。但我建议使用.ConfigureAwait(false),除非涉及到一些 UI。

    blob.FetchAttributes() 是获取 blob 大小的正确方法吗?

    就个人而言,我自己会使用客户端响应标头中的内容长度。但根据 MSDN 文档,这看起来是对的。

    【讨论】:

    • 谢谢!我之前浏览过this blog post 并且完全错过了重点,我想......对于处置问题 - 你对如何解决这个问题有什么建议吗?只需将using 语句全部删除并让GC 处理它?还是等待后的明确处置?要么?不涉及用户界面。它在一个 web api 控制器方法中。
    • 为了处置,我会为你写一个处理这段代码的类,并使 that 类实现IDisposable,然后将你的客户(和其他东西)处置在该类的 dispose 方法。
    • It looks like GetAsync( ) 可以使用HttpCompletionOption。还需要用SendAsync( )吗?
    • @Vegar 不,据我所知(我在有类似项目时使用 SendAsync,因为它符合我的需要,我不知道我需要哪种方法),只要因为你可以提供正确的HttpCompletionOption 你应该没问题。
    • 我无法完成这项工作。代码在 client.GetAsync( ) 之后退出。没有错误或任何东西。只是'噗'......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多