10

背景: asmx Web サービスからのインバウンド/アウトバウンド Soap メッセージをログに記録する単純な SoapExtension クラスを作成しようとしています。msdnのこの記事に従って、私は物事を機能させることができました。ただし、コードをコピーして貼り付けるだけでなく、なぜ/どのように機能するのかを理解したいと思います。

質問: 具体的に把握するのに苦労しているのは、例の IO ストリームの処理です。私がウェブで読んだ他のすべての記事は、同じ方法でストリームを処理します...最初に元のストリームへの参照を取得し、メモリ内に「作業中の」ストリームを作成し、次に必要に応じて内容を交換します。

最初の質問は、このコンテキストでの「ストリーム チェーン」とはどういう意味ですか? ストリームについての私の理解は、任意のストリームに書き込むと、パイプラインの「内部」ストリームに自動的に書き込まれるということです。その場合、あるストリームから別のストリームにコンテンツを手動でコピーする必要があるのはなぜですか?

2 番目の質問は、Copy メソッドの例では、StreamReader と StreamWriter を破棄せずに毎回作成しています。これは GC に余分な圧力をかけていませんか? トラフィックの多い Web サービスで必要なものとは思えません...両方を using ステートメントでラップしようとしましたが、リーダー/ライターを破棄するとストリームも閉じられ、より深刻なエラーが発生しました。.NET 4 には新しい Stream.CopyTo(Stream) メソッドがありますが、.NET 3.5 のより良いアプローチは何でしょうか?

4

2 に答える 2

3

さて、ストリームを連鎖させることにより、基本的に、連鎖したシーケンスで、さまざまなことを行うさまざまなストリームを持つことができます。たとえば、データを圧縮する1つのストリームと、データを暗号化する別のストリーム(または、反対方向に移動している場合はその逆)を作成できます。

ChainStream自体に関しては、まあ...これについて言うことはたくさんあります。Inside of Chainstreamと呼ばれるこの記事を本当にお勧めします。これは非常に詳細で、質問のほとんどをカバーしています。

于 2011-03-28T10:27:29.623 に答える
2

連鎖はフレームワークで行われます。元のストリームを取得し、変更した結果を配置したストリームを返します。フレームワークは、この新しいストリームを他の拡張機能にチェーンします。

連鎖は「逆方向」に機能するため、このように実装されています。通常、ストリームの上に新しい機能を追加しますが、この場合、元のストリームに供給された情報を処理する必要があります。

ストリームで close を呼び出すことは、Dispose と同じです。

于 2011-03-28T12:29:04.610 に答える