序列化时发生WCF回调错误

问题描述:

我正在编程一个Azure WCF应用程序。序列化时发生WCF回调错误

一个datacontract定义如下:
[DataContract]
public class UserInfo
{
[DataMember]
public string UserName { get; set; }
[DataMember]
public int UserID { get; set; }
[DataMember]
public bool IsOnline { get; set; }
}

然后我在WCF服务定义datacontract:

[DataContract(Name="UserInfo")]
public class ServiceUserInfo : UserInfo
{
[IgnoreDataMember]
public ICallback Callback { get; set; }
}

服务合同中

然后,它会回调到客户端,该方法如下

private void NoticeUsers(UserInfo currentuser)
{
var users = UserManager.GetAllActiveUsers();
foreach (var user in users)
{
if (user.UserName == currentuser.UserName)
continue;
user.Callback.UpdateUserList(currentuser);
}
}

其实我将一个ServiceUserInfo对象作为参数传递给NoticeUsers方法。然后会发生如下错误:

尝试序列化参数http://tempuri.org/:user时发生错误。 InnerException消息是'类型'WCFServiceWebRole.ServiceUserInfo',数据协定名称'UserInfo:http://schemas.datacontract.org/2004/07/WCFServiceWebRole'不是预期的。考虑使用DataContractResolver或将任何不知道的类型静态添加到已知类型列表中 - 例如,通过使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表中。有关更多详细信息,请参阅InnerException。

我无法找到此问题的解决方案。请帮助。

我想我找到了问题的根源,但是我不知道为什么。

问题是由服务合同的名称空间属性造成的。

我没有设置我的服务契约接口和数据契约接口的名称空间。我认为它会被默认设置,它不会导致任何问题。但实际上这个线程的问题是由Namespace属性造成的。我为服务契约和数据契约设置了名称空间属性,当然是相同的名称空间,然后它就起作用了。这个问题再也没有发生过。

但是,我不知道为什么会造成这个问题。如果我没有设置命名空间,它将是默认值“http://tempuri.org”,不是吗?