WCF回调在序列化时出错



我正在编程一个Azure WCF应用程序。

数据合约定义如下:
[DataContract]
public class UserInfo
{
[DataMember]
public string UserName { get; set; }
[DataMember]
public int UserID { get; set; }
[DataMember]
public bool IsOnline { get; set; }
}

然后我在WCF服务中定义了一个数据契约:

[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消息为"Type"WCFServiceWebRole.ServiceUserInfo,数据协定名称为"UserInfo:http://schemas.datacontract.org/2004/07/WCFServiceWebRole不应为"。考虑使用DataContractResolver或将任何未知类型静态添加到已知类型列表中,例如,使用KnownTypeAttribute属性或将它们添加到传递给DataContractSerializer的已知类型列表。'。有关详细信息,请参阅InnerException。

我找不到解决这个问题的办法。请帮忙。

我想我已经找到了问题的根本原因,但我不知道为什么。

该问题是由服务约定的Namespace属性引起的。

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

然而,我不知道为什么会引起这个问题。如果我不设置Namespace,它将是默认值"http://tempuri.org",不是吗?

最新更新