【问题标题】:Custom object returning as "empty" from WCF?自定义对象从 WCF 返回为“空”?
【发布时间】:2009-01-29 22:47:16
【问题描述】:

WCF 出于什么原因应该返回我一个“空”的实例化对象,当它在我的 WCF 服务返回中明确填充时,它在通过网络之前返回?

例如一个简单的OperationContract 方法:

response.Client = new Client();
response.Client.ID = 99;
return response;

返回一个“空”客户端对象(在客户端接收端),所有字段都为空或零。但是就在响应之前,如果我检查 response.Client.ID 它填充了 99?

更糟糕的是,我有一个错误对象,我这样填充:

response.Errors.Add(new CodedError(Errors.ErrorCodes.LOGIN_AUTHENTICATION_ERROR));

但是我可以看到接收端的错误列表吗?

【问题讨论】:

    标签: .net wcf


    【解决方案1】:

    如果有人遇到这个问题,我已经找到了解决办法。由于业务需求,我用[Serializable] 和[DataContract] 标记了我的自定义类,从.NET 3.5 SP1 开始,这似乎是非法的?

    我有一个朋友在 .NET 3.5 SP1 之前发送具有这两个属性的 WCF 对象,并且工作正常。很有趣。

    仅供参考,我只使用了[Serializable],它通过我的对象图正确发送。我需要这个来进行 xml 序列化。

    这是一个痛苦的问题,但很高兴它现在终于可以正常工作了......

    【讨论】:

    • [DataMemebers] 发生了什么,您是否也将它们更改为 [Serializable]?
    【解决方案2】:

    您的对象是标记为 [Serializable] 还是 [DataContract]?您需要将您的对象标记为一个或另一个。

    WCF 只知道如何通过网络传递原语或可序列化对象。

    【讨论】:

    • 是的,模型实际上被标记为两者,因为我需要在客户端执行序列化以保存到文件。
    • 有趣。在这一点上我什么都没有。会再考虑一下。
    • Np。很难看不到我的模型,但它是一个非常标准的模型,尽管人们会假设,好吧,错误模型有效。客户端模型不起作用。模型之间存在不兼容性,所以我试图将其削减,因为 Client 有另一个自定义对象,看看它会做什么......
    • 天哪。我已经解决了,一个类不能在 WCF 中同时标记为 [DataContract] 和 [Serializable]。对象结果为空!似乎仅使用 [Serializable] 就可以很好地传输对象,这是我无论如何都需要的主要属性。感谢您的帮助。
    • 太棒了!很高兴你明白了。我学到了一些新东西! :)
    【解决方案3】:

    客户端代理是最新的吗?我已经看到当合同更改并且客户端没有更新以反映更改时会发生这种情况。

    【讨论】:

    • 感谢 cmets MattK,如您所见,我知道它是什么 :(
    【解决方案4】:

    现在可能为时已晚,但是对于这个特殊问题有一个简单的解决方法。至少有人会觉得这很有用。

    我有 2 个具有不同命名空间的项目。

    1. MyProject.Business.Entities(标有[DataContract])
    2. MyProject.Client.Entities(代表业务对象的客户端实体)

    使用 AssemblyInfo.cs 并将以下行添加到每个业务和客户项目。

    [assembly: ContractNamespace("http://www.tempuri.org/MyProject",
                                  ClrNamespace = "MyProject.Business.Entities")]
    
    [assembly: ContractNamespace("http://www.tempuri.org/MyProject",
                                  ClrNamespace = "MyProject.Client.Entities")]
    

    或者,您也可以这样做。

    [DataContract (Namespace = "http://www.tempuri.org/MyProject")]
    public class Account
    {}
    

    【讨论】:

      【解决方案5】:

      我遇到了同样的问题。我已经更改了服务器端对象上的命名空间,虽然我已经更新了服务参考配置,但仔细观察命名空间是旧的命名空间,所以虽然提琴手确认数据正在正确地通过网络传输,但数据没有传递到我的客户对象。删除并重新添加服务引用就可以了

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 2015-07-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-04
        相关资源
        最近更新 更多