var incomingStream = ...
var outgoingStream = ...
await incomingStream.CopyToAsync(outgoingStream);
Приведенный выше код достаточно прост и копирует входящий поток в поток outgoign. Обе потоки, которые передаются, перемещаются вперед/назад по второму.Как создать поток обтекания потока, который может преобразовать поток
Теперь, позволяет сказать, что я хотел Transform поток что-то вроде Func<Stream,Stream,Task>
как бы я сделать это без чтения всех данных.
Ofcause я мог бы просто сделать
var ms = new MemoryStream();
incomingStream.CopyTo(ms);
--- do transform of streams and seek
ms.CopyTo(outgoingStream)
но прочитал бы дырочная вещь в мс, есть ли какая-либо сборка, которая позволяет мне читать из входящего потока и писать в новый поток, который не буферизует все, а вместо этого просто сохраняет небольшой внутренний поток для буферизованных данных, и он не будет читать из входящего потока до данные снова удаляются.
То, что я пытаюсь сделать, это:
protected async Task XmlToJsonStream(Stream instream, Stream outStream)
{
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreWhitespace = false;
var reader = XmlReader.Create(instream, readerSettings);
var jsonWriter = new JsonTextWriter(new StreamWriter(outStream));
jsonWriter.WriteStartObject();
while (await reader.ReadAsync())
{
jsonWriter.writeReader(reader);
}
jsonWriter.WriteEndObject();
jsonWriter.Flush();
}
protected async Task XmlFilterStream(Stream instream, Stream outStream)
{
XmlReaderSettings readerSettings = new XmlReaderSettings();
readerSettings.IgnoreWhitespace = false;
var reader = XmlReader.Create(instream, readerSettings);
var writer = XmlWriter.Create(outStream, new XmlWriterSettings { Async = true, CloseOutput = false })
while (reader.Read())
{
writer.writeReader(reader);
}
}
, но я не знаю, как подключить его.
var incomingStream = ...
var outgoingStream = ...
var temp=...
XmlFilterStream(incomingStream,temp);
XmlToJsonStream(temp,outgoingstream);
, потому что, если я использую MemoryStream, как темп, то не только в конце есть все хранится в потоке. Поиск в потоке, который отбрасывает данные снова, когда он был прочитан.
Все вышеперечисленное представляет собой пример кода, отсутствующий в распоряжении некоторых объектов и ищет причины, но я надеюсь, что мне удалось проиллюстрировать то, что я собираюсь сделать. Чтобы иметь возможность на основе настроек подключаться и играть между простым копированием потока, выполнять фильтрацию xml и необязательно преобразовывать его в json.
Я вижу, что этот способ более чистый, но с использованием потоков, как в моем примере, можно было бы использовать XmlReader/Writer и JsonReader/Writers для преобразования. Я подумаю о дизайне больше. –
@ PoulK.Sørensen Вы когда-нибудь выяснили что-нибудь? Я в подобной ситуации. Попытка использовать SqlClient Streaming, которая просто берет «поток» в качестве параметра, но я хочу сжать исходный поток по мере его поступления в базу данных. Поэтому по существу я хочу обернуть исходный поток (то есть «FileStream») с помощью «GZipStream», так что каждый раз, когда SqlClient Streaming предположительно инициирует «ReadAsync», мой поток-оболочка сначала будет считывать данные из базового потока, сжимать данные, а затем возвращать сжатые байты для потоковой передачи SqlClient. – Terry