假设我有以下WCF实现:
public Stream Download(string path)
{
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
return stream;
}
谁负责处理退回的价值?毕竟,可能会发生网络故障,因此消费者可能无法处置它。
答案 0 :(得分:48)
服务负责关闭流,除非您更改默认行为it does it automatically(始终使用带有defalut值的行为)。如果将OperationBehavior.AutoDisposeParameters
设置为false
,则必须为OperationContext.OperationCompleted
注册处理程序,并按照here所述在处理程序中处理该流。
客户端无法关闭流,因为客户端有不同的流 - 您没有传递对流的引用或对文件处理程序的引用。内部文件内容被复制到传输和客户端处理它自己的流实例(他负责处理它)。
答案 1 :(得分:33)
如果您在MessageContract中包装Stream(因此您可以在标头中发送更多信息),请注意Stream不会自动处理!作为OperationBehavior.AutoDisposeParameters属性的名称,WCF会自动处理输入/输出参数,因此您必须在MessageContract类上实现IDisposable并在那里关闭流。
答案 2 :(得分:1)
您可以在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;