我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, 不能用于通信,因为它处于Faulted状态。
显然,我的File
实体引用了Directory
个实体,Directory
个实体有一个文件列表。首先,我认为这将是典型的循环引用陷阱,但我在异常消息中没有得到它的迹象。关于这个问题的任何想法?
答案 0 :(得分:1)
这将是循环引用陷阱(here是关于此主题的内容)并且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();
}
}
}