4

このコードを使用して、ユーザーが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");
}
4

1 に答える 1

3

application/msi代わりにバイナリエンコーディングとコンテンツタイプを使用してみてくださいtext/plain。ASCIIまたはテキストコンテンツではないため、ファイルを操作しています。

于 2010-03-04T20:30:57.367 に答える