c#: возврат потока в ядре Web API. - PullRequest
0 голосов
/ 10 марта 2020

У меня есть сервер веб-API ASP. NET, написанный на C# (v2.2). Один из моих открытых методов, создание MemoryStream и добавление в него данных. В конце верните его методом return File(ms).

Мой код выглядит следующим образом:

[HttpGet]
[Route("my-endpoint")]
public async Task<ActionResult> TestMe()
{
    MemoryStream ms = new MemoryStream();
    StreamWriter sw = new StreamWriter(ms);
    await sw.WriteLineAsync($"A,B,C").ConfigureAwait(false);
    await sw.WriteLineAsync($"1,2,3").ConfigureAwait(false);
    await sw.FlushAsync().ConfigureAwait(false);
    ms.Seek(0, SeekOrigin.Begin);

    return File(ms, "application/csv");
}

Проблема здесь в том, что этот код не удаляет весь поток из памяти для конечно. В случае, если все было в порядке, поток будет закрыт кодом ASP. NET. Если было сгенерировано исключение, поток не будет удален.

Я думал, что правильный способ его реализации будет (этот код НЕ работает):

[HttpGet]
[Route("my-endpoint")]
public async Task<ActionResult> TestMe()
{
    using (MemoryStream ms = new MemoryStream())
    using (StreamWriter sw = new StreamWriter(ms))
    {
        await sw.WriteLineAsync($"A,B,C").ConfigureAwait(false);
        await sw.WriteLineAsync($"1,2,3").ConfigureAwait(false);
        await sw.FlushAsync().ConfigureAwait(false);
        ms.Seek(0, SeekOrigin.Begin);

        return File(ms, "application/csv");
    }
}

Проблема вот когда мы покидаем функцию (в строке return). Затем поток будет удален, прежде чем будет возвращен клиенту.

Как заставить мой код работать безопасно?

1 Ответ

2 голосов
/ 10 марта 2020

Нет ничего плохого в вашем первом методе. Если выдает код (либо в вашем методе, либо в asp. net framework), то в конечном итоге поток и средство записи будут собраны сборщиком мусора.

Если ничего не происходит, класс File вызовет Dispose в потоке памяти, но поскольку это просто оболочка над массивом byte, на самом деле ничего не произойдет, пока не включится сборщик мусора, так что в любом случае ваш код в порядке.

...