为了在将文件返回给客户端时减少内存使用,在解密时,我们使用了流。这一直很好,直到出现一个怪癖,即当您将相同的文件上传回服务器时(例如,当客户端修改它时)。它会导致 .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);
}
然后调用加密方法:
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);
当我开发这个时,似乎在使用中包装任何这些都会导致对象处理异常,但是我可能做错了什么。
有谁知道如何解决这样的问题?