【问题标题】:WCF service throw Exception for some typesWCF 服务对某些类型抛出异常
【发布时间】:2012-10-15 13:41:26
【问题描述】:

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

[DataMember]
Private User objUser;

[DataMember]
Private tempClass ObjTemp;

我对这两个属性都有 get 和 set 属性。在我的实现类中,我有一个 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 变量。如果条件失败,则抛出异常。谁能解释一下可能是什么问题?

我刚刚检查了另一件事。

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

有什么建议吗?

【问题讨论】:

    标签: c# visual-studio-2010 wcf


    【解决方案1】:

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

    引用一个简短的sn-p:

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

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


    编辑:

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

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

    【讨论】:

    • 谢谢你的回复,让我看看你提到的链接。然后我会回复你的。
    • 好的,objUser 是不可序列化的,但我应该使其可序列化还是应该使用其他方法?因为 objUser 是一个存在于另一个项目中并且工作正常的类的对象。如果我更改我的 User 类,那么可能会出现问题。给我建议如何解决这个问题?
    • @user,我个人会使其可序列化。如果它引入了太多的风险,因为它被用于其他项目或者它不适合作为 DTO,那么你应该创建一个新的 User 对象来满足你的需求。
    • 但是为什么这个类不可序列化?如果我评论 IPAddress 属性,我的用户类工作正常。我的意思是用户类有一个像这样的属性 public IPAddress IP{get;set;} 如果我评论这个代码它工作正常。这意味着我的 IPAddress 类不可序列化,对吗?但为什么它不像所有其他类一样可序列化?我在我的 User 类中使用了许多其他类,但一切正常,只有 IPAddress 类会产生问题。为什么?
    • @user,查看我的编辑。我给了你一大堆参考链接,应该会让你忙一阵子;)这似乎已经回答了您的问题,所以如果您同意,请不要忘记将其标记为答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多