Поток как возвращаемое значение в WCF-кто им распоряжается?


допустим, у меня есть следующая реализация WCF:

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

кто отвечает за удаление возвращенного значения? В конце концов, может произойти сбой сети, поэтому потребитель не сможет его утилизировать.

3 52

3 ответа:

сервис отвечает за закрытие потока и, если вы не измените поведение по умолчанию он делает это автоматически (поведение со значениями defalut всегда используется). Если вы установите OperationBehavior.AutoDisposeParameters до false вы должны зарегистрировать обработчик для OperationContext.OperationCompleted и утилизировать поток в обработчике, как описано здесь.

клиент не может закрыть поток, потому что у клиента есть другой - вы не передаете ссылку на свой поток или ссылку на свой обработчик файлов. Внутреннее содержимое файла копируется на транспорт, и клиент обрабатывает его в своем собственном экземпляре потока (где он отвечает за его утилизацию).

Если вы обернете поток в MessageContract (чтобы вы могли отправить дополнительную информацию в заголовках), остерегайтесь, что поток не будет удален автоматически! Как имя атрибута OperationBehavior.AutoDisposeParameters предполагает, что WCF автоматически размещает параметры ввода / вывода, и поэтому вы должны реализовать IDisposable в своем классе MessageContract и закрыть поток там.

вы можете утилизировать возвращенный поток в WCF, как показано ниже

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;