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

时间:2019-04-14 10:37:34

标签: c# stream asp.net-core-2.1

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

  

“ System.InvalidOperationException:内部流位置已意外更改。   在Microsoft.AspNetCore.Http.Internal.ReferenceReadStream.VerifyPosition()   在Microsoft.AspNetCore.Http.Internal.ReferenceReadStream.Read(Byte []缓冲区,Int32偏移量,Int32计数)   在System.IO.Stream.CopyTo(流目标,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问题上表现出不同,或者我做错了事。

1 个答案:

答案 0 :(得分:1)

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

因此,请确保:

  • OpenReadStream上调用File1,然后完全处理文件的内容
  • 然后仅在OpenReadStream上致电File2,依此类推