从Silverlight调用WCF时的CommunicationException(或者如何在一个函数中从DB获取所有数据)

时间:2014-01-07 12:12:21

标签: c# wcf silverlight

我有一个关于使用Liqn to SQL使用DB的问题。

我有一个小数据库,其中包含4个表,我有为此表创建的Liq to SQL类: Class Diagramm 所以,它都是在我的AppName上创建的。 Web 项目。我还创建了一个WPF服务,它返回包含所有条目的List集合。 当我试图从Silverlight项目调用我的函数时,我有 CommunicationException 。我试图设置maxReceivedMessageSizemaxBufferSize,但问题仍然存在。我将[DataContract][DataMember]标记添加到自动生成的类(属性除外,代表引用,例如Items表中的ModRecipes和{{ 1}}在Entries表中,等等,它开始工作,但我只能从一个表中接收数据。

如何在所有表中收到包含所有子项的Mod列表? linq to sql是最好和最简单的方法之一吗?

UPD1: 返回列表的函数:

Item

1 个答案:

答案 0 :(得分:0)

CommunicationException非常广泛。您可以在WCF服务上创建一个简单的操作,以确保它可以访问,并且您没有配置/托管问题吗?

或者打开WCF消息记录并使用svctraceviewer更好地了解CommunicationException(http://msdn.microsoft.com/en-us/library/ms730064(v=vs.110).aspx)的根本原因

还要确保在从WCF服务返回之前,您已经实现了Linq2Sql查询的结果。

对于对象关系映射器(ORM)的选择,不推荐使用Linq2Sql,而选择EntityFramework。它仍然有效,但很像人类的附录,它是一个进化的死胡同。


在查看堆栈跟踪之后,我已经能够确定WCF无法序列化相关类型,因为Linq2Sql将它们作为动态代理发出,而不是作为已标记为数据协定的类型。我建议手动或使用像Automapper这样的效果进行映射,然后再从服务返回 Select(i => new Mod() { Items = i.Items.Select((j) => new Item() { Foo = j.Foo } } });

还有一点需要注意:EntityFramework允许选项关闭动态代理,但我不知道Linq2Sql是否支持。 (作为两者之间的比较点)