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;