某些类型的WCF服务抛出异常

时间:2011-05-11 07:14:27

标签: c# visual-studio-2010 wcf

我创建了一个WCF服务。在我的数据合同中,我有两个属性可以说:

[DataMember]
Private User objUser;

[DataMember]
Private tempClass ObjTemp;

我已经获取并设置了两个属性的属性。在我的实现类中,我有一个datacontract类的对象...让我们说。 objData

当我指定

objData.ObjTemp=(function which return objTemp);

服务工作正常。但是,当我分配时。

objData.objUser=(function which return objUser)

它会抛出以下错误:

  

基础连接已关闭:连接已关闭   出乎意料。

当我发表评论时

objData.objUser=(function which return objUser)

再次正常工作。

当我检查User类中的代码时,我发现一个属性产生了问题。当我更改属性时它也可以正常工作;但我不知道为什么这个属性会造成问题。

该属性是这样的:

public IPAddress IP { get; set; }

现在这个IPAdress类包含一个构造函数,并为ip变量获取和设置。在get中,它只返回ip变量。

在set中检查一些条件,然后将值赋给ip变量。如果条件失败,则抛出异常。任何人都可以解释问题是什么吗?

我刚刚检查过另一件事。

如果我从[DataMember]移除private User objUser;属性,则可以正常工作;但是如果我把[DataMember]放回来就会产生同样的错误。

有什么建议吗?

1 个答案:

答案 0 :(得分:1)

您很可能会发现objUser不可序列化。欲了解更多信息,请阅读:MSDN: Using Data Contracts

引用一小段内容:

  

所有.NET Framework原始类型(例如整数和字符串)以及被视为基元的某些类型(例如DateTime和XmlElement)都可以序列化而无需其他准备工作,并被视为具有默认数据协定。 ...您创建的新复杂类型必须具有为其序列化的数据协定。

您还可以考虑使用Microsoft的Service Trace Viewer tool来帮助找出您遇到的确切问题。


修改

如果它是您正在讨论的System.Net.IPAddress对象,则它被标记为[Serializable],但它没有default parameterless constructor,这是必需的要求之一使用DataContractSerializer(用于在WCF边界上序列化数据对象)。您可能还需要确保,如果您的WCF调用中使用的任何自定义对象包含任何其他自定义对象(在属性中,如IPAddress),则会使用KnownType attribute进行修饰。

因此,作为一种解决方案,您可以编写自己的IPAddress类,与DataContractSerializer一起使用,也可以切换到WCF调用中使用XmlSerializer