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;
}