gpt4 book ai didi

c# - WCF 服务为某些类型抛出异常

转载 作者:太空宇宙 更新时间:2023-11-03 14:18:45 25 4
gpt4 key购买 nike

我创建了一个 WCF 服务。在我的数据契约(Contract)中我有两个属性可以说:

[DataMember]
Private User objUser;

[DataMember]
Private tempClass ObjTemp;

我已经为这两个属性获取和设置了属性。在我的实现类中,我有一个 datacontract 类的对象......可以说。 objData.

当我分配

objData.ObjTemp=(function which return objTemp);

服务很好。但是,当我分配时。

objData.objUser=(function which return objUser)

它抛出以下错误:

The underlying connection was closed: The connection was closed unexpectedly.

当我发表评论时

objData.objUser=(function which return objUser)

它再次正常工作。

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

属性是这样的:

public IPAddress IP { get; set; }

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

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

我刚刚检查了另一件事。

如果我从 private User objUser; 中删除 [DataMember] 属性,它工作正常;但是如果我把 [DataMember] 放回去,它会产生同样的错误。

有什么建议吗?

最佳答案

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

引用一小段:

All .NET Framework primitive types, such as integers and strings, as well as certain types treated as primitives, such as DateTime and XmlElement, can be serialized with no other preparation and are considered as having default data contracts.... New complex types that you create must have a data contract defined for them to be serializable.

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


编辑:

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

因此,作为一种解决方案,您可以编写自己的 IPAddress 类来很好地与 DataContractSerializer 配合使用,或者切换到在 WCF 调用中使用 XmlSerializer

关于c# - WCF 服务为某些类型抛出异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5960568/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com