Получение «Положение внутреннего потока неожиданно изменилось» в AWS Lambda - PullRequest
1 голос
/ 14 апреля 2019

Я выполняю загрузку файлов в ядре ASP.Net. Все работает нормально при локальном тестировании в Windows, но когда я развертываю свой код на AWS Lambda, я получаю

"System.InvalidOperationException: позиция внутреннего потока неожиданно изменилась. в Microsoft.AspNetCore.Http.Internal.ReferenceReadStream.VerifyPosition () в Microsoft.AspNetCore.Http.Internal.ReferenceReadStream.Read (буфер Byte [], смещение Int32, число Int32) at 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 Ответ

1 голос
/ 14 апреля 2019

Как указано в этом выпуске , в зависимости от того, какой тип сервера вы используете, вы не можете получить доступ к файловым потокам в любом порядке. Вам нужно открывать и обрабатывать файлы в последовательном порядке, или вы получите это исключение «Положение внутреннего потока изменилось неожиданно».

Поэтому обязательно:

  • Вызовите OpenReadStream на File1, затем полностью обработайте содержимое файла
  • Только тогда звоните OpenReadStream на File2 и т. Д.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...