来自 asp.net MVC 控制器的文件结果返回视图 html 字符串而不是文件

问题描述 投票:0回答:1

我在克隆并尝试处理的遗留存储库中有一个非常奇怪的行为。

有一个下载文件的操作(文件托管在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 大。

以下是标题:

enter image description here

enter image description here

另外,渲染的下载按钮 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>

有什么想法会发生什么吗?

c# asp.net-mvc amazon-s3
1个回答
0
投票

我也有类似的问题。原因是我的 MemoryStream 被过早处置。我的异常处理页面捕获了该异常,该页面将 html 内容返回给客户端。删除“使用”后一切正常。

© www.soinside.com 2019 - 2024. All rights reserved.