C # расширяющий SoapExtension - - PullRequest
9 голосов
/ 25 марта 2011

Справочная информация: Я пытаюсь написать простой класс SoapExtension для регистрации входящих / исходящих сообщений Soap от веб-службы asmx.После этой статьи на MSDN я смог заставить все работать.Однако мне бы очень хотелось понять, почему / как это работает, а не просто копировать и вставлять код.

Вопрос: Что я пытаюсь понять, так это обработка ввода-выводапотоки в примере.Все остальные статьи, которые я читал в Интернете, обрабатывают потоки идентичным образом ... сначала получают ссылку на исходный поток, создают «работающий» поток в памяти, а затем меняют содержимое по мере необходимости.

Первый вопрос: что подразумевается под «цепочкой потоков» в этом контексте?Мое понимание потоков состоит в том, что запись в любой поток будет автоматически записывать «внутренние» потоки в конвейере.Если это так, то почему необходимо вручную копировать содержимое из одного потока в другой?

Второй вопрос заключается в том, что в примерах метода Copy они каждый раз создают StreamReader и StreamWriter без их утилизации -это не оказывает дополнительного давления на GC?Не похоже, что вы хотели бы получить в веб-сервисе с высоким трафиком ... Я попытался обернуть оба в использование операторов, но удаление читателя / писателя также закрыло поток, что привело к более серьезным ошибкам.В .NET 4 появились новые методы Stream.CopyTo (Stream), но что может быть лучше для .NET 3.5?

Ответы [ 2 ]

3 голосов
/ 28 марта 2011

Что ж, объединяя потоки, вы можете в основном иметь разные потоки, которые делают разные вещи, в цепочечной последовательности.Например, у вас может быть один поток, который сжимает данные, а затем другой поток, который шифрует данные (или наоборот, если мы движемся в другом направлении).

Что касается самого ChainStream, ну ...Есть много вещей, чтобы сказать об этом.Я действительно рекомендую эту статью под названием Inside of Chainstream , которая является чрезвычайно углубленной и охватывает большинство вопросов, которые у вас есть.

2 голосов
/ 28 марта 2011

Цепочка выполняется в рамках. Вы получаете исходный поток и возвращаете поток, в который вы поместили измененный результат. Фреймворк объединит этот новый поток в любые другие расширения.

Это реализовано таким образом, потому что цепочка работает "в обратном направлении". Обычно вы добавляете новые функции поверх потоков, но в этом случае вы хотите работать с информацией, поступающей в исходный поток.

Вызов close в потоке аналогичен Dispose.

...