我正在编写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:
[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。
我无法找到解决此问题的方法。请帮助。
答案 0 :(得分:0)
我想我找到了问题的根本原因,但我不知道为什么。
问题是由服务合同的Namespace属性引起的。
我没有设置服务合约接口和数据合约接口的命名空间。我认为它会默认设置,不会造成任何问题。但实际上这个线程的问题是由Namespace属性引起的。我为服务契约和数据契约设置了Namespace属性,当然是相同的命名空间,然后就可以了。问题再也不会发生了。
但是,我不知道为什么会引起这个问题。如果我没有设置Namespace,它将是默认值“http://tempuri.org”,不是吗?