Wcf 服务 returns 流但不会关闭
Wcf service returns stream but it won't close
我有一个 WCF 服务,它打开一个文件然后 returns 它的流到客户端。客户端使用 stream.CopyTo(...) 将流内容保存到文件中,然后关闭返回的流。
在这个 'download' 步骤之后,我们尝试使用另一个 WCF API 调用删除服务器上的文件,但是我们得到一个“进程无法访问该文件...因为它正在被使用”通过另一个过程。 (mscorlib)”异常。几分钟后,此 "lock" 消失,可以删除文件。
如果客户端流Close()帮不上忙,我应该怎么做才能让服务器释放流并让文件删除?
客户端收到的流与服务器打开并传递给客户端的流不同。想象一下被互联网隔开的客户端工作站和服务器:如果将流发送到客户端,则客户端不会在服务器的硬盘上保存 OS 物理流的句柄。因此,关闭客户端收到的流不会在服务器端释放流。
几分钟后文件 可以 被删除的事实可能是因为服务器实例或会话已被处理,同时释放了流。
换句话说:发送后关闭(处理)服务器上的流。
根据 this article,您可以在操作完成后处理 return 值。
做这样的事情:
public Stream GetFile(string path)
{
Stream fileStream = null;
try
{
fileStream = File.OpenRead(path);
}
catch(Exception)
{
return null;
}
OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args)
{
if (fileStream != null)
fileStream.Dispose();
});
return fileStream;
}
我有一个 WCF 服务,它打开一个文件然后 returns 它的流到客户端。客户端使用 stream.CopyTo(...) 将流内容保存到文件中,然后关闭返回的流。
在这个 'download' 步骤之后,我们尝试使用另一个 WCF API 调用删除服务器上的文件,但是我们得到一个“进程无法访问该文件...因为它正在被使用”通过另一个过程。 (mscorlib)”异常。几分钟后,此 "lock" 消失,可以删除文件。
如果客户端流Close()帮不上忙,我应该怎么做才能让服务器释放流并让文件删除?
客户端收到的流与服务器打开并传递给客户端的流不同。想象一下被互联网隔开的客户端工作站和服务器:如果将流发送到客户端,则客户端不会在服务器的硬盘上保存 OS 物理流的句柄。因此,关闭客户端收到的流不会在服务器端释放流。
几分钟后文件 可以 被删除的事实可能是因为服务器实例或会话已被处理,同时释放了流。
换句话说:发送后关闭(处理)服务器上的流。
根据 this article,您可以在操作完成后处理 return 值。
做这样的事情:
public Stream GetFile(string path)
{
Stream fileStream = null;
try
{
fileStream = File.OpenRead(path);
}
catch(Exception)
{
return null;
}
OperationContext clientContext = OperationContext.Current;
clientContext.OperationCompleted += new EventHandler(delegate(object sender, EventArgs args)
{
if (fileStream != null)
fileStream.Dispose();
});
return fileStream;
}