将大型 Base64 字符串读取为块以避免分配给 LOH C#

发布于 2025-01-09 04:05:09 字数 1028 浏览 1 评论 0原文

我从 API 发送大文件作为 base64 编码字符串,我将其转换为 byte[] 数组(一次性),然后通过控制器操作返回给客户端,例如:

byte[] fileBytes = Convert.FromBase64String(base64File);

return this.File(fileBytes);

FileContentResult - MSDN

在某些情况下,这些文件最终会变得非常大,我认为这导致了fileBytes 对象将被分配到 LOH,一旦超出范围,它不会立即释放。这种情况发生得足够多,导致内存不足异常和应用程序重新启动。

我的问题是,如何读取这些大的 Base64 字符串而不将 byte[] 分配给 LOH?我考虑将其读入流中,然后返回 FileStreamResult 相反,例如:

using(var ms = new MemoryStream(fileBytes))
{
    // return stream from action
}

但我仍然需要首先将 base64 转换为 byte[] 。是否可以以较小的块读取 Base64 本身,从而创建较小的 byte[] 而不会最终出现 LOH?

I'm sent large files from an API as base64 encoded strings which I convert to a byte[] array (in one go) and then return to the client via controller action, example:

byte[] fileBytes = Convert.FromBase64String(base64File);

return this.File(fileBytes);

FileContentResult - MSDN

In some cases, these files end up being very large which I believe is causing the fileBytes object to be allocated to the LOH where it wont be immediately freed once out of scope. This is happening enough that it is causing out of memory exceptions and the application to restart.

My question is, how can I read these large base64 strings without allocating a byte[] to the LOH? I thought about reading it into a stream and then returning a FileStreamResult instead e.g:

using(var ms = new MemoryStream(fileBytes))
{
    // return stream from action
}

But I'd still need to convert the base64 to byte[] first. Is it possible to read the the base64 itself in smaller chunks, therefore creating smaller byte[] which wouldn't end up in LOH?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文