在AWS Lambda中获得“内部流位置意外更改”

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在AWS Lambda中获得“内部流位置意外更改”相关的知识,希望对你有一定的参考价值。

我正在ASP.Net核心实现文件上传。在Windows上进行本地测试时,一切正常,但是当我在AWS Lambda上部署代码时,我得到了

“System.InvalidOperationException:内部流位置已意外更改。在Microsoft.AspNetCore.Http.InternalReadStad.VerifyPosition()处于Microsoft.AspNetCore.Http.Internal.ReferenceReadStream.Read(Byte []缓冲区,Int32偏移量,Int32计数)在System.IO.Stream.CopyTo(Stream destination,Int32 bufferSize)“

我的代码:

[HttpPost]
[Route("")]
[Authorize]
public IActionResult Store([FromForm] MyFiles files)
{
    var stream1 = files.File1.OpenReadStream();
    var stream2 = files.File2.OpenReadStream();
    string result;
    using (MemoryStream ms = new MemoryStream())
    {
        stream1.CopyTo(ms);
        ms.Position = 0;
        result= GetCrcForFile(ms);
    }
}

public class MyFiles
{
    public IFormFile File1 { get; set; }
    public IFormFile File2 { get; set; }
}

public string GetCrcForFile(Stream result)
{
    uint crc = 0;
    using (MemoryStream ms = new MemoryStream())
    {
        result.CopyTo(ms);
        var bytes = ms.ToArray();
        crc = Crc32Algorithm.Compute(bytes);
        return crc.ToString("X");
    }
}

例外情况发生在result.CopyTo(ms);线上

我不确定.Net Core是否在Linux环境或AWS Lambda问题上表现不同,或者我做错了什么。

答案

in this issue所示,根据您使用的服务器类型,您无法以任何顺序访问文件流。您需要按顺序打开和处理文件,否则您将收到“内部流位置意外更改”异常。

因此,请确保:

  • OpenReadStream上调用File1,然后完全处理文件的内容
  • 只有这样,在OpenReadStream上调用File2,依此类推

以上是关于在AWS Lambda中获得“内部流位置意外更改”的主要内容,如果未能解决你的问题,请参考以下文章

AWS Lambda 中的 Firebase 实时数据库查询未获得最新结果

AWS AppSync Lambda 解析器字段

计算AWS lambda调用并按api键分段数据

有啥方法可以在 AWS Lambda 中获取 Cognito 用户名?

如何从 lambda 调用 IAM 授权的 AWS ApiGateway 端点?

我可以在每个请求上更改我的 AWS Lambda 公共 IP 吗?