none
Fonctionnement du streaming WCF RRS feed

  • Question

  • Salut à tous,
    J'ai une nouvelle question sur le streaming, en effet j'ai codé un téléchargement de fichier Service -> Client. Le client récupère un flux qu'il vient relire mais je ne comprends pas le fonctionnement exacte qui est mis en place (plus ou moins à mon insu). Je m'explique: côté client je récupère un objet qui contient 2 Headers et un Body (le flux qui n'est autre que le fichier en lui-même). Voici le code (côté client):
    Code :
    ChannelFactory<IImpressionEdition> factory = new ChannelFactory<IImpressionEdition>("epImpressionEdition");
                impressionEdition = factory.CreateChannel();
    
                SelectionsUtilisateur selectionsUtilisateur = new SelectionsUtilisateur(listCat, listDonnee);
    
                mfile = impressionEdition.DonneFichierRapport(selectionsUtilisateur);
                sourceStream = mfile.DataFile;
    
                *************
    
                //Spécification du répertoire où l'on souhaite placer le fichier
                string uploadFolder = String.Format("{0}{1}\\{2}", AppDomain.CurrentDomain.BaseDirectory
                                                    , ConfigurationSettings.AppSettings["UploadDirectory"]
                                                    , mfile.FileName);
    
                //destinationStream va récupérer le sourceStream qui correspond au corps du MessageFile renvoyé 
                //par le service, cette récupération se fait par morceau, la taille de chaque partie étant spécifiée 
                //par la constante bufferLen
                using (destinationStream = new FileStream(uploadFolder, FileMode.Create, FileAccess.Write, FileShare.None))
                {
                    const int bufferLen = 8192;
                    byte[] buffer = new byte[bufferLen];
                    int count = 0;
                    while ((count = sourceStream.Read(buffer, 0, bufferLen)) > 0)
                    {
                        destinationStream.Write(buffer, 0, count);
                    }
                    sourceStream.Close();
                }
    Ma question vient du fait que, si je remplace les * par
    Code :
    factory.close();
    j'arrive toujours à récupérer mon fichier par contre, si je mets un point d'arrêt à ce niveaux et que je ferme l'hébergeur de mon service, seules quelques boucles de relecture sont effectuées avant de remonter une erreur du type "canal de communication fermé". J'en déduis donc, à vous de me confirmer ou d'infirmer, que la mécanique interne du fonctionnement du streaming crée un canal (en gros un createChannel()) sans que je ne puisse rien y faire. Ma question est donc double, ai-je bien compris? et Comment cela fonctionne-t-il dans le détail? (appels successifs ou non, session, etc...).
    Merci d'avance à tous!!!!
    mardi 15 juillet 2008 13:05

Toutes les réponses

  • Je dirais plutôt que le rôle de la factory et de créer des channels mais aussi de les libérer:
    - un Close est en général équivalent à un Dispose mais il est sémantiquement plus compréhensible: donc le Close libère (détruit) l'objet factory. Ou plutôt marque l'objet comme détruit.
    - au bout d'un laps de temps variable, le GC détruit effectivement la factory, ce qui a pour conséquence de fermer du même coup les channels associés.

    Donc, tu as l'impression que tes channels sont toujours disponibles alors qu'en réalité ils sont aussi détruits par le factory.Close(). Pour t'en convaincre, tu peux toujours faire un GC.Collect() juste après et tu devrais voir que tes channels sont immédiatement perdus ...

    J'espère que c'est clair.

    Xavier
    vendredi 22 mai 2009 12:27