ASP.NET MVC:可以通过FileContentResult返回MSI文件而不破坏安装包吗?

时间:2010-03-04 20:06:42

标签: asp.net-mvc-2 windows-installer streamreader filecontentresult

我正在使用此代码返回带有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   安装程序包。

我知道问题不是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");
}

1 个答案:

答案 0 :(得分:3)

尝试使用二进制编码和内容类型application/msi而不是text/plain - 它不是ASCII或文本内容,因此您要修改文件。