出于什么原因,当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));
但是我可以在接收端看到错误列表吗?
答案 0 :(得分:8)
如果有人遇到这个问题,我找到了修复程序。由于业务需求,我使用[Serializable]
和[DataContract]
标记了我的自定义类,从.NET 3.5 SP1开始,这似乎是非法的?
我有一个朋友在.NET 3.5 SP1之前发送带有这两个属性的WCF对象,并且工作正常。有趣。
仅供参考,我只是使用了[Serializable]
,它正在通过我的对象图正确发送。我需要在轨道上进行xml序列化。
这是一个痛苦的问题,但很高兴它现在终于正常运作......
答案 1 :(得分:3)
您的对象是标记为[可序列化]还是[DataContract]?您需要将对象标记为一个或另一个。
WCF只知道如何通过网络传递基元或可序列化对象。
答案 2 :(得分:2)
客户端代理是最新的吗?我已经看到,当合同发生变化并且客户未更新以反映变更时,就会发生这种情况。
答案 3 :(得分:2)
现在可能为时已晚,但对于这个特殊问题有一个简单的解决办法。至少有人会觉得这很有用。
我有两个具有不同命名空间的项目。
[DataContract]
)使用 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确认数据正在通过线路正确传输时,数据未通过到我的客户端对象。删除和重新添加服务引用就可以了解