1

ファイルをクライアントに返すときのメモリ使用量を減らすために、復号化中にストリームを使用しました。これは、同じファイルをサーバーにアップロードして戻すとき (たとえば、クライアントがファイルを変更したとき) の 1 つの癖までは正常に機能していました。.netコアが「別のプロセスで使用されているため、プロセスはファイルパスにアクセスできません」をスローします。

このシステムはまだ開発中なので、アプリケーションをリリースではなくデバッグ モードで実行するのが癖なのかどうかはわかりません。コードをリリースに組み込みましたが、それでも同じエラーが発生しました。

ストリームがどのように機能するかを知っていることから、ストリームは自動的に破棄されるはずです。

ストリームを作成する最初のメソッドには、次のものが含まれます。

return (await Decrypt(File.OpenRead(path), AesKey, AesIv), contentType);

次に、復号化メソッドは次の処理を実行します。

public static async Task<MemoryStream> Decrypt(FileStream data, string key, string iv)
{
    Aes aes = Aes.Create();

    aes.KeySize = 256;
    aes.BlockSize = 128;
    aes.Padding = PaddingMode.Zeros;

    aes.Key = Encoding.ASCII.GetBytes(key);
    aes.IV = Encoding.ASCII.GetBytes(iv);

    ICryptoTransform decryptor = aes.CreateDecryptor(aes.Key, aes.IV);

    return await PerformCryptography(data, decryptor);
}

次に、crypto メソッドを呼び出します。

private static async Task<MemoryStream> PerformCryptography(FileStream data, ICryptoTransform cryptoTransform)
{
    MemoryStream memoryStream = new MemoryStream();
    CryptoStream cryptoStream = new CryptoStream(memoryStream, cryptoTransform, CryptoStreamMode.Write);

    await data.CopyToAsync(cryptoStream);
    cryptoStream.FlushFinalBlock();
    memoryStream.Seek(0, SeekOrigin.Begin);
    return memoryStream;
}

これは、以下を返すコントローラーにチェーンを戻します。

return File(file, contentType, fileName);

私がこれを開発していたとき、これらのいずれかを使用中にラップすると、オブジェクトが破棄された例外が発生するように見えましたが、何か間違ったことをした可能性があります。

誰もこのようなものを修正する方法を知っていますか?

4

1 に答える 1