У меня есть действие, которое требует чтения файла из безопасного места, поэтому я должен использовать олицетворение для чтения файла.
Этот код РАБОТАЕТ:
[AcceptVerbs(HttpVerbs.Get)]
public ActionResult DirectDownload(Guid id)
{
if (Impersonator.ImpersonateValidUser())
{
try
{
var path = "path to file";
if (!System.IO.File.Exists(path))
{
return View("filenotfound");
}
var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "application/octet-stream", "FileName");
}
catch (Exception e)
{
Log.Exception(e);
}finally
{
Impersonator.UndoImpersonation();
}
}
return View("filenotfound");
}
Единственная проблема с приведенным выше кодом заключается в том, что мне нужно прочитать весь файл в память, и я собираюсь иметь дело с ОЧЕНЬ большими файлами, так что это не хорошее решение. Но если я заменю эти 2 строки:
var bytes = System.IO.File.ReadAllBytes(path);
return File(bytes, "application/octet-stream", "FileName");
с этим:
return File(path, "application/octet-stream", "FileName");
Это НЕ работает, и я получаю сообщение об ошибке:
Доступ к пути
«C: \ Проекты \ загрузки \ 1 \ aa2bcbe7-ea99-499d-add8-c1fdac561b0e \ Без названия
2.csv 'отказано.
Я полагаю, что, используя файл File Results с путем, пытается открыть файл позднее в конвейере запросов, когда я уже "отменил" олицетворение.
Помните, что код олицетворения работает, потому что я могу прочитать файл в массиве байтов. Что я хочу сделать, так это передать файл клиенту.
Есть идеи, как мне обойти это?
Заранее спасибо.