我仍然无法理解如何使用异步方法。我在控制器中有以下代码。
[HttpPost]
public async Task<IActionResult> ManualUpload([Bind("MktRpt")] ManualMktRptFileUpload itemFileUpload)
{
var manager = new RecyclableMemoryStreamManager();
using (var stream = manager.GetStream())
{
await itemFileUpload.MktRpt.CopyToAsync(stream);
await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}
itemFileUpload.status = "Success";
return View(itemFileUpload);
}
我的服务方法也很简单:
public async Task saveBlob(MemoryStream stream, string filename)
{
var blockBlob = _container.GetBlockBlobReference(filename);
await blockBlob.UploadFromStreamAsync(stream);
}
以及一个简单的模型类:
public class ManualMktRptFileUpload
{
[Required]
[Display(Name = "Manual Report")]
public IFormFile MktRpt { get; set; }
public string status { get; set; } = "Constructed";
}
当我在Azure中检查我的Blob容器时,该文件是BUT,它是零字节。
我认为这是因为我没有正确等待流转移,但我不知道如何修复它。
答案 0 :(得分:4)
我怀疑这与async有什么关系。目前,您正在将一个流复制到MemoryStream
,但随后会离开&#34;光标&#34;在MemoryStream
的末尾...任何试图从中读取的内容都不会看到新数据。
修复非常简单:只是&#34;倒带&#34;在您调用saveBlob
方法之前的流:
using (var stream = manager.GetStream())
{
await itemFileUpload.MktRpt.CopyToAsync(stream);
stream.Position = 0;
await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}
或者,避免完全复制到MemoryStream
:
using (var stream = itemFileUpload.MktRpt.OpenReadStream())
{
await _azureStorageService.saveBlob(stream, Path.GetFileName(itemFileUpload.MktRpt.FileName));
}