stream作为WCF返回值 – 谁处置它?

假设我有以下的WCF实现:

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

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

服务负责closuresstream,除非您更改默认行为, 它会自动执行 (具有defalut值的行为始终使用)。 如果将OperationBehavior.AutoDisposeParameters设置为false ,则必须为OperationContext.OperationCompleted注册处理程序,并按照此处所述将处理程序置于处理程序中。

客户端无法closuresstream,因为客户端有一个不同的 – 你没有传递引用到你的stream或引用到你的文件处理程序。 内部文件内容被复制到传输,并且客户端在它自己的stream实例(他负责处理它)的地方处理它。

如果你在MessageContract中封装Stream(所以你可以在头文件中发送更多的信息),注意Stream不会被自动处理! 正如OperationBehavior.AutoDisposeParameters属性的名称所示,WCF会自动处理input/输出参数,因此您必须在MessageContract类上实现IDisposable并closures其中的stream。

你可以像下面那样在WCF中处理返回的stream

 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;