首页 > 解决方案 > 在嵌入式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 中,而且在这个现代异步世界中)?

标签: c#asynchronousembedio

解决方案


推荐阅读