我在克隆并尝试处理的遗留存储库中有一个非常奇怪的行为。
有一个下载文件的操作(文件托管在AWS上): (为了清楚起见,省略了冗余代码)。
public virtual async Task<ActionResult> Entity(EntityModel entity)
{
using (Stream stream = downloadFileObject(model.Updates[GetUpdateNumberFromQueryString()].UpdateLink))
using (MemoryStream ms = new MemoryStream())
{
await stream.CopyToAsync(ms).ConfigureAwait(false);
return File(ms.ToArray(), "application/octet-stream", "The file.exe");
}
}
DownloadFileObject
方法连接到AWS,创建请求并返回响应流:
public Stream GetS3FileObject(string objectKey, string fileName)
{
GetObjectRequest request = new GetObjectRequest
{
BucketName = bucketName,
Key = objectKey,
};
GetObjectResponse response = s3Client.GetObject(request);
return response.ResponseStream;
}
这将返回一个正确的流,没有错误,我可以看到长度指示大约 35 mb,这是我得到的文件的正确大小。
现在,我尝试了几种方法将此流作为可下载文件返回,它们都会导致一些非常奇怪的结果。
浏览器没有获取文件,而是检索一个 110kb 的文本文件,它看起来很像我当前的视图 html...
返回的 HTML 包含以下错误消息(除了常规网站内容)
执行处理程序的子请求时出错 'System.Web.Mvc.HttpHandlerUtil+ServerExecuteHttpHandlerAsyncWrapper'。 使用自定义 TextWriter 时,OutputStream 不可用。
我尝试了几种方法,其中第一个也是最明显的方法就是:
var stream = DownloadFileObject(model.Updates[GetUpdateNumberFromQueryString()].UpdateLink);
return File(stream, "application/octet-stream", "The file.exe");
然后我尝试将该流复制到字节数组并返回它 - 但是,在所有情况下结果都是相同的。 到最后一刻,调试器显示我的流/字节数组有 35mb 大。
以下是标题:
另外,渲染的下载按钮 html 如下:
<a href="/support/product-support/software/TheProductName" class="btn btn-default">Download update</a>
并且按钮是在视图中创建的,没有任何 HTML 帮助器(Action.Link() 等)
<a href="@updateVersions.Link" class="btn btn-default">@Model.SiteLabelDownloadUpdate</a>
有什么想法会发生什么吗?
我也有类似的问题。原因是我的 MemoryStream 被过早处置。我的异常处理页面捕获了该异常,该页面将 html 内容返回给客户端。删除“使用”后一切正常。