53 votes

Stream comme une valeur de retour dans WCF - qui le dispose ?

Disons que j'ai l'implémentation WCF suivante :

public Stream Download(string path)
{
    FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
    return stream;
}

Qui est responsable de l'élimination de la valeur retournée ? Après tout, une panne de réseau peut survenir, et le consommateur peut ne pas être en mesure de s'en débarrasser.

48voto

Ladislav Mrnka Points 218632

Le service est responsable de la fermeture du flux et à moins que vous ne changiez le comportement par défaut il le fait automatiquement (le comportement avec les valeurs défalquées est toujours utilisé). Si vous définissez OperationBehavior.AutoDisposeParameters a false vous devez enregistrer un gestionnaire pour OperationContext.OperationCompleted et disposer du flux dans le gestionnaire comme décrit aquí .

Le client ne peut pas fermer le flux parce que le client en a un autre - vous ne passez pas de référence à votre flux ou à votre gestionnaire de fichiers. En interne, le contenu du fichier est copié sur le transport et le client le traite dans sa propre instance de flux (où il est responsable de sa destruction).

33voto

Peter Sladek Points 328

Si vous enveloppez le Stream dans un MessageContract (pour pouvoir envoyer plus d'informations dans les en-têtes), attention, le Stream ne sera pas éliminé automatiquement ! Comme le nom de l'attribut OperationBehavior.AutoDisposeParameters suggère, WCF dispose automatiquement des paramètres d'entrée/sortie et donc vous devez implémenter IDisposable sur votre classe MessageContract et fermer le flux là.

2voto

JEMI Points 429

Vous pouvez disposer du flux retourné dans WCF comme ci-dessous

FileStream stream=null;
OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += (sender, args) =>
{
    if (stream != null)
        stream.Dispose();
};

stream = new FileStream(path, FileMode.Open, FileAccess.Read);
return stream;

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X