【问题标题】:WCF callback occurs error when serialize序列化时 WCF 回调发生错误
【发布时间】:2012-07-13 09:36:23
【问题描述】:

我正在编写一个 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。

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

【问题讨论】:

    标签: wcf callback datacontract


    【解决方案1】:

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

    问题是由 Service 合约的 Namespace 属性引起的。

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

    但是,我不知道为什么会导致此问题。如果我不设置命名空间,它会是一个默认值“http://tempuri.org”,不是吗?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-16
      • 1970-01-01
      • 2011-03-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多