Extension SoapExtension en C # –

Arrière-plan: j’essaie d’écrire une simple classe SoapExtension pour consigner les messages Soap entrants / sortants d’un service Web asmx. Suite à cet article sur msdn , j’ai pu faire fonctionner les choses. Cependant, j’aimerais vraiment comprendre pourquoi / comment cela fonctionne plutôt que de simplement copier-coller du code.

La question: ce que je cherche à comprendre, c’est le traitement des stream d’E / S dans l’exemple. Tous les autres articles que j’ai lus sur le Web traitent les stream de la même manière … obtenant d’abord une référence au stream d’origine, créant un stream “fonctionnel” en mémoire, puis échangeant le contenu si nécessaire.

La première question est: qu’entend-on par “chaînage de stream” dans ce contexte? D’après ce que je comprends des stream, l’écriture dans n’importe quel stream écrit automatiquement dans les stream “internes” d’un pipeline. Si tel est le cas, pourquoi est-il nécessaire de copier manuellement le contenu d’un stream vers un autre?

La deuxième question est que, dans les exemples, la méthode Copy crée un StreamReader et un StreamWriter à chaque fois, sans les mettre au rebut – cela n’exerce-t-il pas une pression supplémentaire sur le GC? Cela ne semble pas être ce que vous souhaiteriez sur un service Web à fort trafic … J’ai essayé de combiner les deux en utilisant des déclarations, mais le lecteur / rédacteur éliminant a également fermé le stream qui a conduit à des erreurs plus graves. .NET 4 a de nouvelles méthodes Stream.CopyTo (Stream), mais quelle serait une meilleure approche pour .NET 3.5?

Eh bien, en chaînant des stream, vous pouvez avoir différents stream qui font différentes choses, dans une séquence chaînée. Par exemple, vous pouvez avoir un stream qui compresse les données, puis un autre qui chiffre les données (ou l’inverse si nous allons dans l’autre sens).

Quant à ChainStream lui-même, eh bien … Il y a beaucoup de choses à dire à propos de celui-ci. Je recommande vraiment cet article intitulé Inside of Chainstream , qui est extrêmement détaillé et couvre également la plupart des questions que vous vous posez.

Le chaînage est fait dans le cadre. Vous obtenez le stream d’origine et retournez le stream dans lequel vous mettez votre résultat modifié. Le cadre enchaînera ce nouveau stream dans d’autres extensions.

Il est implémenté de cette façon car le chaînage fonctionne “à l’envers”. Normalement, vous ajoutez de nouvelles fonctionnalités en plus des stream, mais dans ce cas, vous souhaitez gérer les informations introduites dans le stream d’origine.

Appeler close on stream est identique à Dispose.