自定义对象从WCF返回为“空”?

时间:2009-01-29 22:47:17

标签: .net wcf

出于什么原因,当WCF在我的WCF服务返回上显然填充它之前,它应该返回一个“空”实例化对象?

例如一个简单的OperationContract方法:

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

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

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

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

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

5 个答案:

答案 0 :(得分:8)

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

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

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

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

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

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

  1. MyProject.Business.Entities (标有[DataContract]
  2. MyProject.Client.Entities (代表业务对象的客户端实体)
  3. 使用 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
    {}
    

答案 4 :(得分:1)

我有同样的问题。我已经更改了服务器端对象上的命名空间,虽然我已经更新了服务引用配置,但仔细查看命名空间是旧的命名空间,所以当fiddler确认数据正在通过线路正确传输时,数据未通过到我的客户端对象。删除和重新添加服务引用就可以了解