【问题标题】:Sending an object to a service hosting a MemoryCache using WCF使用 WCF 将对象发送到托管 MemoryCache 的服务
【发布时间】:2012-07-10 00:03:38
【问题描述】:

我正在修补 WCF 和 MemoryCache。目标是在 Windows 服务中托管 WCF,以便不同的客户端可以访问此缓存。

第一部分,设置主机工作正常,我可以通过单独的客户端应用程序写入和读取缓存。至少,在尝试将非常简单的对象放入缓存时,例如字符串或 int 之类的值类型。

当我尝试一个“自定义”对象时,即使它只有一个字符串属性,也会出现问题:

There was an error while trying to serialize parameter http://tempuri.org/:value. 

TheInnerException message was 'Type 'Solution.MyType' with data contract name 
'MyType:http://schemas.datacontract.org/2004/07/MyType' is not expected. 
Consider using a DataContractResolver or add any types not known statically to the list    
of known types 
- for example, by using the KnownTypeAttribute attribute or by 
adding them to the list of known types passed to DataContractSerializer.'.
Please see   InnerException for more details.

现在经过一番搜索,我发现我可能不得不用 KnownType 属性来装饰我的类型,但可惜没有成功。我也尝试使用 DataContract 和 DataMember 属性来装饰它,但也没有 sigar。

现在该怎么办? WCF DataContractResolver 不应该为我完成这项工作吗?我很难相信我必须为我想要序列化的每个类编写一个自定义 DataContractResolver。 DataContract 和 DataMember 属性还有什么用途?

我在这里缺少什么?另请注意,MyType 不继承自另一个类(保存对象)。

【问题讨论】:

    标签: .net wcf serialization tcp memorycache


    【解决方案1】:

    您是否尝试过使用 Serizlizable 标记标记 MyType?查看 MSDN 库中的“Designing Service Contracts”,了解如何正确创建服务。另外,从服务和实现类中发布一些代码。

    【讨论】:

    • 是的,我有,虽然只有 DataContract 就足够了,不是吗?无论哪种方式都无济于事:(
    【解决方案2】:

    我想你需要处理 WCF 中最有趣的部分之一是 KnownType,看看这里:http://msdn.microsoft.com/en-us/library/ms730167.aspx,基本上你需要为你需要序列化的每个“子”类型指定 KnownTypeAttribute ,即使它们被标记为可序列化。

    【讨论】:

    • MyType 不继承任何东西,保存对象本身并且只包含字符串类型的属性。虽然我试图添加这个 KnownType 属性,但它给我留下了完全相同的错误。使用 net.tcp 绑定而不是 basicHttpBinding 可能与此有关吗?
    • 对不起,我误用了“孩子”,我的意思是您尝试序列化的“主”对象的任何属性类型。
    【解决方案3】:

    我通过实现一些自定义序列化解决了这个问题:

    string result = string.Empty;
            Encoding encoding = Encoding.UTF8;
            DataContractSerializer ser = new DataContractSerializer(typeof(MyType));
            MemoryStream stream = new MemoryStream();
            using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(stream, encoding, true))
            {
                ser.WriteObject(writer, principal);
                writer.Flush();
                result = encoding.GetString(stream.ToArray());
            }
    

    满足我的目的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多