如何检查 Stream.Null?

How do I check for Stream.Null?

我有一个 WCF 服务,它 return 是一个类似于以下内容的流:

public Stream StreamFile(string filepath)
{
    try
    {
        // Grab the file from wherever it is
        // Throw an exception if it doesn't exist
        return fileStream;
    }
    catch (Exception ex)
    {
        // Log the exception nicely in a place of my user's choosing
    }
    return Stream.Null;
}

我曾经尝试 return null,但如果找不到文件,我开始 运行 解决这个问题:WCF - MessageBodyMember - Stream - "Value cannot be null"

通过 returning Stream.Null,我已经摆脱了那个错误,但现在我遇到了另一个问题 - 我的客户如何知道我是否发回了 Stream.Null?我不能't/shouldn检查长度,因为这些文件可能很大,但即使它们不是,我也会面临这个问题:Find Length of Stream object in WCF Client?

这是我的(大大简化的)客户端代码,仅供后代使用,但我下载 Stream.Null 的问题是我最终得到一个空文件,没有人喜欢这样。

public FileInfo RetrieveFile(string fileToStream, string directory)
{
    Stream reportStream;
    string filePath = Path.Combine(directory, "file.txt");
    using (Stream incomingStream = server.StreamFile(fileToStream))
    {
        if (incomingStream == null) throw new FileExistsException(); // Which totally doesn't work      
        using (FileStream outgoingStream = File.Open(filePath, FileMode.Create, FileAccess.Write))
        {
            incomingStream.CopyTo(outgoingStream);
        }
    }
    return new FileInfo(filePath);
}

似乎我只是在某种程度上错误地设计了这个方法,但我想不出一个更好的方法来做到这一点,而不涉及抛出未捕获的异常。有什么建议吗?

当 WCF 服务(或与此相关的任何设计良好的服务)中发生意外情况时,客户端不能/不应该知道细节或关心。它只需要知道出了什么问题。

你应该允许异常出现而不捕获它,客户端会知道发生了错误并且操作失败了,不管文件丢失、没有读取它的权限或者文件可能损坏的事实在磁盘上。 None 其中对客户很重要,因为我无法对信息做任何事情,除非与服务过于耦合。

当然,在那种情况下,return 值毫无意义,实际上代理(通常)会处于故障状态并且不再可用。 (这取决于您的会话模式和实例生活方式)。

请注意,如果你想让客户知道错误并做出反应,你应该将这些错误设计为契约的一部分,并抛出一个 FaultException<> 包装你在契约中明确声明的契约异常。这将允许代理继续可用。你可以阅读更多here