我目前正在使用简单的
从我们的网站下载文件 public ActionResult Download() {
return File(@"D:\Company\Installs\Download.exe", "application/octet-stream", "Download.exe");
}
这很好用,当用户点击该文件时,他们会在文件下载时看到%进度。
我们现在转向Azure文件存储,我尝试使用CloudStorageAccount模拟相同的进程。总的来说,它运行良好,但我想为用户提供相同的用户体验。我认为我非常接近于解决这个问题,但最终的回归'并没有给我一个有效的ActionResult。
public async Task<ActionResult> Download() {
var fileName = "Download.exe";
var storageAccount = CloudStorageAccount.Parse("DefaultEndpointsProtocol=https;....");
var fileClient = storageAccount.CreateCloudFileClient();
var share = fileClient.GetShareReference("downloads");
if (!await share.ExistsAsync()) {
return new EmptyResult();
}
var rootDir = share.GetRootDirectoryReference();
var cloudFile = rootDir.GetFileReference(fileName);
if (!await cloudFile.ExistsAsync()) {
return new EmptyResult();
}
var policy = new SharedAccessFilePolicy
{
Permissions = SharedAccessFilePermissions.Read,
SharedAccessStartTime = DateTime.UtcNow.AddMinutes(-15),
SharedAccessExpiryTime = DateTime.UtcNow.AddHours(1)
};
var url = cloudFile.Uri.AbsoluteUri + cloudFile.GetSharedAccessSignature(policy);
// return File(url, "application/octet-stream", fileName);
return Redirect(url);
}
可以将返回的URL复制/粘贴到浏览器中,并正确下载文件。但是当它作为FilePathResult被返回时,我得到了ERR_INVALID_RESPONSE,奇怪的是,该方法被调用了3次。怪异。
有人可以帮我解决最后一行代码吗?
提前致谢!
答案 0 :(得分:2)
我终于完成了所有这些工作。使其发挥作用的最终改变是
return Redirect(url);