c# - 在嵌入式IO中以异步方式返回文件下载(异步和处理流)
问题描述
虽然这个特殊问题是关于 EmbeddedIO 和 FileReponseAsync,但它可能更多地与 C# 中的任务中的流和异步处理有关。
我正在使用 EmbeddedIO(我需要一个快速而肮脏的 Web 服务器,到目前为止它的运行就像一个魅力——但是缺少文档有点令人沮丧),但我试图返回一个包含以下代码的文件:
var file = new FileInfo(Path.Combine(FileLocations.TemplatePath, templateFile.FilePath));
string fileExtension = Path.GetExtension(templateFile.FilePath);
return this.FileResponseAsync(file, MimeTypes.DefaultMimeTypes.Value.ContainsKey(fileExtension) ?
MimeTypes.DefaultMimeTypes.Value[fileExtension] : "application/octet-stream");
我收到以下错误:
消息
失败模块名称:Web API 模块
无法访问已关闭的文件。 System.IO.__Error.FileNotOpen() 处的
堆栈跟踪
这是有道理的,因为在 EmbedIO 代码中FileResponseAsync看起来像:
using (FileStream fileStream = file.OpenRead())
return context.BinaryResponseAsync(fileStream, ct, useGzip);
并且文件流将在 BinaryReponse 返回后立即处理。我通过将代码更改为不处理文件流解决了这个问题:
var fileStream = file.OpenRead();
return this.BinaryResponseAsync(fileStream);
虽然这可行,但依靠垃圾收集在以后处理这些文件似乎是错误的。应该如何处理这样的资源(不仅在 EmbeddedIO 中,而且在这个现代异步世界中)?
解决方案
推荐阅读
- amazon-web-services - 如何在不同安全组中的 2 个实例之间共享文件?
- tensorflow - 具有手臂特征的 TF-Agents Bandits
- r - 当某些 ID 值为空白时,如何从长转换为宽?
- python - 我想制作每个服务器频道
- python - 协议缓冲区/JSON 模式到 SQL DDL
- c++ - Qt c++ 标签不显示新文本
- unity3d - Chrome 扩展:拒绝加载脚本,因为它违反了以下内容安全策略指令:“script-src 'self'”
- python - 尽管正确的数据库排序和使用了图标,Django 返回区分大小写的结果
- assembly - 如何复制现有的 BPB 并将其放入我的引导加载程序代码中
- c++ - 删除元素后如何返回数组?