Почему возврат MemoryStream устанавливает позицию в конце - PullRequest
0 голосов
/ 26 мая 2020

Я заметил, что возвращение MemoryStream сбрасывает его позицию до «последней» позиции. Почему?

Когда я тестировал это в рабочем методе, перед возвратом я явно установил позицию на 0

myStream.position = 0; // I allso tried myStream.Seek(0, SeekOrigin.Begin);

Но при проверке позиции в обоих случаях позиция не была установлена до 0.

Edit (думал, что это более теоретический вопрос, поэтому я не стал добавлять весь код, но здесь)

public MemoryStream GenerateOpenXmlFileAsStrem()
{
    DataTable table = new DataTable();
    MemoryStream memoryStream = new MemoryStream();
    using SpreadsheetDocument document = SpreadsheetDocument.Create(memoryStream, SpreadsheetDocumentType.Workbook);

    // Here the data gets inserted into the DataTable

    workbookPart.Workbook.Save();
    memoryStream.Position = 0;
    return memoryStream;
}

А затем я попытался протестировать метод

[Test]
public Task GenerateOpenXmlFileAsStremTest()
{
    using (Context context = new Context (_options))
    {
        context.Database.EnsureCreated();
    }

    using (Context context = new Context (_options))
    {
        _target = new Service(_mapper, _mockedLogger.Object, _dbContext, _mockedNotificationService.Object);
        MemoryStream result = _target.GenerateOpenXmlFileAsStrem();

        Assert.NotNull(result);
        Assert.Equal(0, result.Position); // somehow this is not true
    }
}

1 Ответ

1 голос
/ 26 мая 2020

Если SpreadsheetDocument записывает в поток при удалении, это приведет к такому результату. Попробуйте явно вызвать Flush / Close / Dispose перед перемещением потока, например:

document.Dispose();
memoryStream.Position = 0;
return memoryStream;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...