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
实体有一个文件列表。首先,我认为这可能是典型的循环引用陷阱,但我在异常消息中没有看到它的迹象。对这个问题有什么想法吗?
这将是一个循环引用陷阱(这里是关于这个主题的一些东西),并且您的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();
}
}
}