【问题标题】:Wcf service returns stream but it won't closeWcf 服务返回流但它不会关闭
【发布时间】:2016-02-12 06:26:31
【问题描述】:

我有一个 WCF 服务,它打开一个文件然后将其流返回给客户端。客户端使用 stream.CopyTo(...) 将流内容保存到文件中,然后关闭返回的流。

在这个“下载”步骤之后,我们尝试使用另一个 WCF API 调用删除服务器上的文件,但是我们得到一个“进程无法访问文件......因为它正在被另一个进程使用。 (mscorlib)”异常。几分钟后,这个“锁”消失,文件可以被删除。

如果客户端流 Close() 无法提供帮助,我应该怎么做才能让服务器释放流并让文件删除?

【问题讨论】:

    标签: c# wcf stream


    【解决方案1】:

    客户端接收到的流不是服务器打开并传递给客户端的流。想象一下一个客户端工作站和一个服务器,它们被互联网分开:如果一个流被发送到客户端,客户端不会持有服务器硬盘上物理流的操作系统句柄。所以关闭客户端收到的流并不会在服务器端释放流。

    几分钟后文件可以被删除的事实可能是因为服务器实例或会话被释放,也释放了流。

    换句话说:发送后关闭(处置)服务器上的流。

    【讨论】:

    • 我希望客户端关闭会向 wcf 服务发送一条关于此操作的“消息”:(
    【解决方案2】:

    根据this article,您可以在操作完成后处理返回值。

    做这样的事情:

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

    【讨论】:

    • 问题:为什么需要它:if (fileStream != null) ?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多