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ć.
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ę).
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ń.
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;
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