0

我有一个使用 Entity Framework 5.0 和 POCO 实体的 WCF 服务器应用程序。服务器通过 WCF 将 POCO 直接序列化到客户端应用程序(我按照以下博客文章中的说明设法做到了这一点:http: //www.sanderstechnology.com/? p=10142 )。这一直工作得很好,直到我今天遇到一个新问题。

我的数据模型中有一个简单的情况,如下图所示:http ://roponenp.kapsi.fi/images/datamodel.png

在我的服务器中,我有一个可用于获取块的方法:

[OperationContract]
[ApplyDataContractResolver]
[CyclicReferencesAware(true)]
List<Block> GetBlocks();

我需要在我的回复中包含链接到块的项目,因此我执行以下操作:

public List<Block> GetBlocks()
{
    using (ModelContainer db = new ModelContainer())
    {
        db.Configuration.ProxyCreationEnabled = false;
        db.Configuration.LazyLoadingEnabled = false;
        return db.Block.Include(it => it.Project).ToList();
    }
}

在我的数据库中,我有 ProjectA 和 ProjectB 类型的实例(从 Project 继承)。因此,上面的 LINQ 查询实际上包括 ProjectA 和 ProjectB 的类型,以响应我的响应。这些类型被序列化并发送到客户端。发生这种情况时,我在客户端收到以下错误(服务器应用程序中没有错误):

服务器没有提供有意义的回复;这可能是由于合同不匹配、会话过早关闭或内部服务器错误造成的。

问题似乎是在我的数据合同类型 Block 链接到类型 Project。但是,我的响应返回的数据包含链接到 Blocks 的类型 ProjectA 和 ProjectB。

我不知道如何解决这个问题。我认为它可以通过实现自定义 DataContractResolver 来解决,但我还没有找到任何工作示例如何做到这一点。

有任何想法吗?

4

1 回答 1

1

如果您的对象包含其他类型而不是显而易见的类型(例如接口实现或派生类),您将需要KnownType属性。

查看MSDN中的示例,它非常好。

[ServiceContract]
[KnownType(typeof(ProjectA))]
[KnownType(typeof(ProjectB))]
class SomeService
{
  [OperationContract]
  [ApplyDataContractResolver]
  [CyclicReferencesAware(true)]
  List<Block> GetBlocks();
于 2013-04-24T13:55:13.970 回答