Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

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

Ответ 3

Вы можете удалить возвращенный поток в 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;