0

我有一个名为 ExceptionsJSONService 的 WCF 服务。与我的解决方案中定义的所有其他服务不同,由于某种原因,它无法在 javascript 中实例化客户端。

这失败了:

var service = new ExceptionsJSONService();

与预期的对象。我一直在试图弄清楚为什么会发生这种情况,并检查了我在整个项目中的所有定义,一切看起来都很好,并且与我定义的所有其他服务一致(所有这些服务都有效)。

然后我检查了svclog文件,发现有错误。异常类型是:

System.Runtime.Serialization.InvalidDataContractException,System.Runtime.Serialization,版本=4.0.0.0,文化=中性,PublicKeyToken=b77a5c561934e089

异常消息是:

无法序列化类型“System.Data.Entity.DbSet`1[CCMModel.AttachmentDoc]”。考虑使用 DataContractAttribute 属性对其进行标记,并使用 DataMemberAttribute 属性标记您想要序列化的所有成员。如果该类型是一个集合,请考虑使用 CollectionDataContractAttribute 对其进行标记。有关其他支持的类型,请参阅 Microsoft .NET Framework 文档。

CCMModel 是命名空间,而 AttachmentDoc 是我的实体之一。不过,问题不在于 AttachmentDoc。它只是按字母顺序浏览实体列表。我将一个实体从 Attachments 重命名为 RAttachments,它只是继续使用 AttachmentDoc 引发异常。

问题是,在我的代码中,我没有尝试序列化任何 EF 实体。我序列化的所有类都有 DataContracts。我认为这两者相关的原因是在 Open ServiceHost 'ExceptionsJSONService' 出现在 svclog 之后立即发生异常。

有人遇到过这种情况吗?

4

1 回答 1

0

该问题是由 ExceptionsJSONService 类中定义的公共函数引起的。该功能应该是公开的,但它也被标记为操作合同。

在函数的参数列表中是我们的 EF DB 上下文对象。因为它位于操作合同的参数列表中,所以它导致服务搜索与数据库上下文关联的所有实体的数据合同。这导致抛出仅显示在服务跟踪日志中的异常。该异常阻止了服务正确加载,因此当我尝试在 javascript 中实例化服务客户端时,它会失败。

从函数中删除 Operation Contract 属性解决了该问题。

于 2013-07-18T19:42:22.583 回答