Проблема, с которой вы столкнулись, связана с тем, что ваш код выполняется на веб-сервере , а не на компьютере клиентов (пользователей).
Другими словами, когда вы пытаетесь сохранить в Environment.SpecialFolder.Personal
, вы пытаетесь сохранить его в этой папке на веб-сервере, а не на настольном компьютере пользователя.
Что вам нужно сделать, это вернуть содержимое блоба в запросе и позволить браузеру сохранить файл - пользователю, вероятно, будет предложено (в зависимости от настроек браузера), где именно его сохранить. Вы не должны указывать это.
Вот пример того, как это сделать:
public async Task<HttpResponseMessage> DownloadBlobAsync(string file, string fileExtension, string directory)
{
_container = _client.GetContainerReference(containerName);
_directoy = _container.GetDirectoryReference(directory);
CloudBlockBlob blockBlob = _directoy.GetBlockBlobReference(file + "." + fileExtension);
using (var ms = new MemoryStream())
{
await blockBlob.DownloadToStreamAsync(ms);
var result = new HttpResponseMessage(HttpStatusCode.OK)
{
Content = new ByteArrayContent(ms.ToArray())
};
result.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment")
{
FileName = "somefilename.ext"
};
result.Content.Headers.ContentType = new MediaTypeHeaderValue(blockBlob.Properties.ContentType);
return result;
}
}
Обратите внимание , что это неэффективно, поскольку сначала он загружает большой двоичный объект на веб-сервер, а затем возвращает его клиенту. Этого должно быть достаточно, чтобы начать.
Когда браузер получает доступ к этой конечной точке, пользователю будет предложено сохранить файл где-нибудь на ПК.