我的问题类似于这个问题: 文件()在asp.net mvc中关闭流吗?
我在C#MVC 4中有以下内容.
FileStream fs = new FileStream(pathToFileOnDisk, FileMode.Open);
FileStreamResult fsResult = new FileStreamResult(fs, "Text");
return fsResult;
Run Code Online (Sandbox Code Playgroud)
会fs自动关闭FileStreamResult吗?谢谢!
我有一个DocumentGenerator包装的课程MemoryStream.所以我已经IDisposable在课堂上实施了.
我看不出如何/在哪里可以处理它.
这是我当前的代码,它在MVC中执行文件下载:
using (DocumentGenerator dg = DocumentGenerator.OpenTemplate(path))
{
/* some document manipulation with the
DocumentGenerator goes here ...*/
return File(dg.GetDocumentStream(), "text/plain", filename);
}
Run Code Online (Sandbox Code Playgroud)
在控制器完成之前关闭/处理流时出现此错误.在这种情况下,如何确保我的资源得到妥善处理?
编辑:我现在的执行IDisposable只是处置MemoryStream.我知道这不是一个正确的实现,我只是用它作为测试.有什么不同我可以在这里做它的工作吗?
public void Dispose()
{
_ms.Dispose();
_ms = null;
}
Run Code Online (Sandbox Code Playgroud) 在我的服务中,我们需要获取另一个服务创建的 zip 文件并将其返回。
这是我的代码(代码已针对问题进行了简化):
[HttpGet("mediafiles/{id}")]
public async Task<IActionResult> DownloadMediaFiles(int id)
{
var fileIds = _myProvider.GetFileIdsForEntityId(id); // result be like "1,2,3,4"
using var httpClient = new HttpClient();
var response = await httpClient.GetAsync($"http://file-service/bulk/{fileIds}");
var stream = await response.Content.ReadAsStreamAsync();
return File(stream, "application/octet-stream", "media_files.zip");
}
Run Code Online (Sandbox Code Playgroud)
使用id我可以收集创建fileIds字符串所需的信息并调用其他服务。
这是其他服务上的api(已针对问题简化了代码):
[HttpGet("bulk/{idList}")]
public async Task<IActionResult> DownloadBulk(string idList)
{
var ids = string.IsNullOrEmpty(idList) ? new List<int>() : idList.Split(',').Select(x => Convert.ToInt32(x));
using var memoryStream = new MemoryStream();
using (var archive = new ZipArchive(memoryStream, ZipArchiveMode.Create, true))
{ …Run Code Online (Sandbox Code Playgroud) c# ×3
asp.net ×2
asp.net-mvc ×2
api ×1
asp.net-core ×1
idisposable ×1
stream ×1
streaming ×1
zip ×1