【问题标题】:Upload file to Azure blob via web api通过 web api 将文件上传到 Azure blob
【发布时间】:2014-01-24 07:10:02
【问题描述】:

我正在尝试找出一种通过 web api 上传文件的方法,而不必将整个文件保存到磁盘或内存中。

这是我的 api 控制器代码:

public async Task<IHttpActionResult>Post([FromUri] string ext) 
{
  string fileName = string.Concat(Guid.NewGuid(), ext);
  var blob = AzureBlobContainer.GetBlockBlobReference(fileName);
  await blob.UploadFromStream(await Request.Content.ReadAsStreamAsync()); // here is the issue
  return Ok();
}

我正在使用 HttpClient 进行上传:

public async Task<bool> Upload(string requestUrl, Stream fileStream)
{
  var progress = new ProgressMessageHandler();
  progress.HttpSendProgress += HttpSendProgress;
  var client = HttpClientFactory.Create(progress);
  HttpResponseMessage response = await client.PostAsync(requestUrl, new StreamContent(fileStream));
  response.EnsureSuccessStatusCode();
  return response.IsSuccessStatusCode;
}

private void HttpSendProgress(object sender, HttpProgressEventArgs e)
{
  Debug.WriteLine("progress is {0}% ({1} of {2})", e.ProgressPercentage, e.BytesTransferred, e.TotalBytes);
}

此代码将成功将文件上传到 Azure。但是,整个文件在 web api 服务器上缓冲,然后复制到 Azure。这会导致进度事件中的消息在文件上传到 api 控制器时计数高达 100%,然后在文件上传到 Azure 时显示为阻塞。 我知道因为我使用的是 StreamContent,所以 web api 不应该缓冲我的上传。

在这个问题中讨论了一个解决方案,这让我觉得这是可能的:WebAPI Request Streaming support

我的客户端代码在一个可移植的类库中,所以不能对 Azure .net 存储库有任何依赖(所以我不能直接上传到 Azure,除非我使用底层 REST API)

【问题讨论】:

  • 它是 Windows Phone 8/Windows 8 应用程序吗?我问的原因是因为如果是这样的话,可能还有其他选择。
  • 这个想法是使用一个可移植的类库,所以它被设计用于任何一个。

标签: azure file-upload asp.net-web-api


【解决方案1】:

正如您提供的链接中所讨论的,您需要在您的服务中将缓冲策略设置为非缓冲模式,因为默认情况下该策略是缓冲。

StreamContent 可以保存缓冲或非缓冲流,它不决定主机上的请求流是否应该缓冲。做出此决定的托管层。

【讨论】:

  • 谢谢,我没有意识到它只是设置为不缓冲 StreamContent 响应。应用它似乎确实改善了这种情况:现在我的进度事件反映了完整上传到 Azure。但是,它仍然在工作进程中消耗大量内存。例如如果我上传一个 100MB 的文件,在文件上传时内存使用量会增加到 ~150MB。就好像整个文件仍在服务器上缓冲。
猜你喜欢
  • 2020-03-02
  • 2017-07-10
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 2022-01-12
  • 2021-09-30
  • 2017-03-14
  • 2022-01-12
相关资源
最近更新 更多