Пользовательский MedaTypeFormatter вызывает ObjectDisposedException

У меня есть собственный форматировщик для поддержки моих веб-звонков, но отчет об ошибках пролил некоторый свет на проблему. Я переопределял WriteToStreamAsync() метод как таковой:

public override Task WriteToStreamAsync(Type type,
                                        object value,
                                        Stream writeStream,
                                        HttpContent content,
                                        TransportContext transportContext)
{
    return Task.Run(() =>
        {
            if (value == null) return;
            using (var sw = new StreamWriter(writeStream))
            {
                var serialized = _serializer.Serialize(value);
                sw.Write(serialized);
            }
        });
}

Согласно этому сообщению, проблема заключалась в том, что using Заявление было причиной закрытия потока. Решение состояло в том, чтобы удалить using заявление и использовать явное Flush() звонить, но кажется неправильным полагаться на то, что GC распоряжается StreamWriter,

public override Task WriteToStreamAsync(Type type,
                                        object value,
                                        Stream writeStream,
                                        HttpContent content,
                                        TransportContext transportContext)
{
    return Task.Run(() =>
        {
            if (value == null) return;
            var sw = new StreamWriter(writeStream);
            var serialized = _serializer.Serialize(value);
            sw.Write(serialized);
            sw.Flush();
        });
}
  1. Это серьезная проблема?
  2. Есть ли лучший (более практичный) способ сделать это?

1 ответ

Это серьезная проблема?

Нет, если Stream Выживает читатель и становится ясно, кто отвечает за утилизацию потока.

Это распространено и в.NET Framework. Например, если Icon создан из Stream, вы не должны утилизировать его (не используйте using создать при создании значка), потому что он будет использоваться созданным экземпляром.

Есть ли лучший (более практичный) способ сделать это?

  • Если вы создаете оба Stream и StreamWriter в том же объеме история понятна, вы можете распоряжаться ими.
  • Если вы получаете уже существующий Stream, вы не можете быть уверены, что вам разрешено Stream, Не закрывайте его, если в документации нет четкого представления об этом.
Другие вопросы по тегам