Я использую этот код для возврата FileContentResult с файлом MSI для загрузки пользователем в мой ASP.NET MVC контроллер:
using (StreamReader reader = new StreamReader(@"c:\WixTest.msi"))
{
Byte[] bytes = Encoding.ASCII.GetBytes(reader.ReadToEnd());
return File(bytes, "text/plain", "download.msi");
}
Я могу загрузить файл, но когда я пытаюсь запустить установщик, я получаю сообщение об ошибке:
Этот установочный пакет не может быть
открыт. Связаться с поставщиком приложения
чтобы убедиться, что это действительная Windows
Пакет установщика.
Я знаю, что проблема не в C: \ WixTest.msi, потому что он работает нормально, если я использую локальную копию. Я не думаю, что я использую неправильный тип MIME, потому что я могу получить что-то похожее, просто используя File.Copy и возвращая скопированный файл через FilePathResult (без использования StreamReader), который действительно работает после загрузки.
Мне нужно использовать FileContentResult, однако, чтобы я мог удалить копию файла, который я делаю (что я могу сделать, как только я загрузил его в память).
Мне кажется, я делаю недействительным установочный пакет, копируя или кодируя файл. Есть ли способ прочитать файл MSI в память и вернуть его через FileContentResult, не повредив установочный пакет?
Решение:
using (FileStream stream = new FileStream(@"c:\WixTest.msi", FileMode.Open))
{
BinaryReader reader = new BinaryReader(stream);
Byte[] bytes = reader.ReadBytes(Convert.ToInt32(stream.Length));
return File(bytes, "application/msi", "download.msi");
}