假设我有以下的WCF实现:
public Stream Download(string path)
{
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
return stream;
}
谁负责处理返回值的清理?毕竟,可能会发生网络故障,因此使用者可能无法进行清理。
假设我有以下的WCF实现:
public Stream Download(string path)
{
FileStream stream = new FileStream(path, FileMode.Open, FileAccess.Read);
return stream;
}
谁负责处理返回值的清理?毕竟,可能会发生网络故障,因此使用者可能无法进行清理。
服务负责关闭流,如果不更改默认行为 (默认情况下始终使用)则会自动关闭。如果将OperationBehavior.AutoDisposeParameters
设置为false
,则必须为OperationContext.OperationCompleted
注册处理程序,并在处理程序中按照此处所述处理流。
客户端无法关闭流,因为客户端具有不同的流 - 您未传递到流或文件处理程序的引用。内部将文件内容复制到传输并且客户端在其自己的流实例中处理它(在那里客户端有责任处置它)。
如果你在MessageContract中包装了Stream(这样你可以在标头中发送更多信息),请注意Stream不会自动释放!正如属性OperationBehavior.AutoDisposeParameters的名称所示,WCF会自动处理输入/输出参数,因此您必须在MessageContract类上实现IDisposable接口,并在那里关闭流。
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;