Stream jako wartość zwracana w WCF-kto ją rozporządza?

Załóżmy, że mam następującą implementację WCF:

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

Kto jest odpowiedzialny za pozbycie się zwracanej wartości? W końcu może wystąpić awaria sieci, a więc konsument może nie być w stanie jej pozbyć.

Author: Ron Klein, 2011-06-26

3 answers

Usługa jest odpowiedzialna za zamknięcie strumienia i jeśli nie zmienisz domyślnego zachowania robi to automatycznie (zachowanie z wartościami defalut jest zawsze używane). Jeśli ustawisz OperationBehavior.AutoDisposeParameters na false Musisz zarejestrować handler dla OperationContext.OperationCompleted i usunąć strumień w handlerze tak, jak opisano tutaj .

Klient nie może zamknąć strumienia, ponieważ klient ma inny-nie przekazujesz referencji do strumienia ani referencji do obsługi plików. Wewnętrznie zawartość pliku jest kopiowana do transport i klient przetwarza go we własnym strumieniu (gdzie jest odpowiedzialny za jego utylizację).

 48
Author: Ladislav Mrnka,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-06-26 11:02:04

Jeśli owijasz strumień w MessageContract (dzięki czemu możesz wysłać więcej informacji w nagłówkach), uważaj, że strumień nie zostanie usunięty automatycznie! Jako nazwa operacji atrybutówbehavior.AutoDisposeParameters sugeruje, WCF automatycznie usuwa parametry wejściowe/wyjściowe i dlatego musisz zaimplementować IDisposable na swojej klasie MessageContract i zamknąć tam strumień.

 32
Author: Peter Sladek,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-10-19 21:58:03

Możesz usunąć zwrócony strumień w WCF jak poniżej

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;
 1
Author: JameelM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-02 09:20:55