流作为WCF中的返回值 - 谁处置它?

Ron*_*ein 53 .net wcf idisposable stream

假设我有以下WCF实现:

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

谁负责处理退回的价值?毕竟,可能会发生网络故障,因此消费者可能无法处置它.

Lad*_*nka 48

服务负责关闭流,除非您更改默认行为,否则它会自动执行(始终使用带有defalut值的行为).如果设置OperationBehavior.AutoDisposeParametersfalse您必须为注册的处理程序OperationContext.OperationCompleted和描述的处理处置流在这里.

客户端无法关闭流,因为客户端具有不同的流 - 您没有传递对流的引用或对文件处理程序的引用.内部文件内容被复制到传输和客户端处理它自己的流实例(他负责处理它).


Pet*_*dek 33

如果您在MessageContract中包装Stream(因此您可以在标头中发送更多信息),请注意Stream不会自动处理!作为OperationBehavior.AutoDisposeParameters属性的名称,WCF会自动处理输入/输出参数,因此您必须在MessageContract类上实现IDisposable并在那里关闭流.