我正在使用此代码返回带有 MSI 文件的 FileContentResult 供用户在我的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 Installer 程序包。
我知道问题不在于 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");
}