このコードを使用して、ユーザーがASP.NETMVCコントローラーにダウンロードできるようにMSIファイルを含むFileContentResultを返します。
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");
}