WCF + EF 4.1主动加载和序列化问题

本文关键字:加载 序列化 问题 EF WCF | 更新日期: 2023-09-27 18:10:01

我的OperationContract实现的简单情况如下:

public List<Directory> GetDirectories(bool includeFiles)
{
    if (includeFiles)
    {
        return this.db.Directories.Include(e => e.Files).ToList();
    }
    else
    {
        return this.db.Directories.ToList();
    }
}

,其中GetDirectories(false);工作完全正常,GetDirectories(true);抛出CommunicationObjectFaultedException消息:

通信对象System.ServiceModel.Channels.ServiceChannel,不能用于通信,因为它处于fault状态。

显然,我的File实体有对Directory实体的引用,Directory实体有一个文件列表。首先,我认为这可能是典型的循环引用陷阱,但我在异常消息中没有看到它的迹象。对这个问题有什么想法吗?

WCF + EF 4.1主动加载和序列化问题

这将是一个循环引用陷阱(这里是关于这个主题的一些东西),并且您的CommunicationObjectFaultedException的原因将类似于:

using (var client = new ServiceClient())
{
    data = client.GetDirectories(true);
}

原因是未处理的异常使通道出错,using试图在该故障通道上调用Close -这是通道状态机中无效的转换(以及一个很大的WCF奇怪之处),导致了您提到的异常。有许多方法可以避免它,但基本是:

ServiceClient client = null;
try
{
    client = new ServiceClient();
    data = client.GetDirectories(true);
}
finally
{
    if (client != null)
    {
        if (client.State == CommunicationState.Faulted) 
        {
            client.Abort();
        } 
        else 
        {
            client.Close();
        }
    }
}