.net 在WCF服务中管理重复数据

.net 在WCF服务中管理重复数据,.net,wcf,datacontractserializer,.net,Wcf,Datacontractserializer,我正在编写一个WCF服务,它接收来自不同客户端的大型消息。 每个消息都由一个对象图组成,其中许多内部对象可能是相同的。 我的服务将这些消息中的数据存储到内存中 我正在尽量减少服务的内存消耗。因此,我希望存储单个对象,而不是从网络接收的几个相同的对象(嵌套在对象图中) 我使用的是DataContractSerializer,所以首先想到的是使用选项preserveObjectReferences,但是这种方法有一些缺点: 没有与其他技术的互操作性(如果这是唯一的问题,我可以接受) 序列化和反序列

我正在编写一个WCF服务,它接收来自不同客户端的大型消息。 每个消息都由一个对象图组成,其中许多内部对象可能是相同的。 我的服务将这些消息中的数据存储到内存中

我正在尽量减少服务的内存消耗。因此,我希望存储单个对象,而不是从网络接收的几个相同的对象(嵌套在对象图中)

我使用的是DataContractSerializer,所以首先想到的是使用选项
preserveObjectReferences
,但是这种方法有一些缺点:

  • 没有与其他技术的互操作性(如果这是唯一的问题,我可以接受)
  • 序列化和反序列化过程运行较慢
  • 当对象在不同的消息(可能来自不同的客户端)之间相同时,没有多大帮助。仅适用于同一消息中同一对象图上的对象
所以,接下来想到的是使用某种缓存。 当我收到一条消息时,我可以遍历对象图,使用缓存为所有相同的对象找到一个实例,并用这个实例更新我的存储。当存储器处理对该对象的所有引用时,可以将其从缓存中删除,并释放该对象的内存

我可以使用,但不幸的是,我的键不是字符串,我不想将它们转换为字符串只是为了将它们存储在缓存中。(当微软将ObjectCache限制为字符串键时,他们是怎么想的?)

所以,在重新编写一个具有弱引用和密钥的缓存类(可以与IEqualityComparer进行比较)之前,我想确保我没有遗漏任何东西


我的问题是:
  • 有没有更好的方法来处理(并存储在内存中)WCF服务中的重复对象
  • 有没有一个好的(高效的、通用的、开放的)缓存实现,我可以用它来代替重写

您可以使用Microsoft App Fabric Server(Velocity)缓存,它非常适合WCF服务的部署


你知道你使用了太多内存还是过早优化了吗?@RalphWillgoss我知道我使用了太多内存。只要看看Process Explorer,我就能看到内存消耗在相对较短的时间内增长到数百兆字节。您需要将这些对象保留多久?@RalphWillgoss。这些对象描述复杂的客户端状态,并由客户端更新。客户端可以(间接地)添加此类对象并将其从服务中删除。我计划为这些对象添加一些过期时间,但它将在几天到几周之间。看起来有点过头了。我看不到MemoryCache的好处(在我的例子中,我不需要分布式缓存)。App Fabric Cache API也基于字符串键,而不是一般的可比较键(从文档中我可以看出),我希望避免将键转换为字符串。