我创建了一个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]
放回来就会产生同样的错误。
有什么建议吗?
答案 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。