我有一个 WCF 服务,它执行搜索并向客户端返回一个相当复杂的对象列表。这是一个 EAV 系统,因此返回的每个实体都有一个附加值列表,其大小取决于实体蓝图。
在我的测试搜索中,我已经通过记录确认,几乎在每种情况下,实际搜索都需要不到一秒钟的时间才能完成。在将响应返回给客户端之前,我做的最后一件事是记录处理已完成。
不幸的是,客户在我完成后 15-20 秒后才收到响应。总响应大小约为 250kb,非常小。这正在通过 LAN 传输,我尝试禁用防火墙和防病毒软件以确保两者都不会干扰。
然而,我注意到,如果响应非常小,例如通过删除附加到每个实体的字段,响应会更快地通过。我还尝试单步执行服务的本地托管 (IIS) 副本,在通过最终return
语句后,仍然需要 15 秒才能到达本地客户端应用程序。
我正在使用 basicHttpBinding,因为 .Net 和 PHP 客户端都将使用该服务。
那么,任何人都可以提出一种我可以确认情况确实如此的方法吗?以及如何解决极其缓慢的序列化时间?
编辑:
为了澄清,我用 [DataContract] 属性标记了每个类,用 [DataMember] 标记了每个属性——当我返回数据时,WCF 正在处理序列化。在这种情况下,它是一个实体类型的列表(一个包含值列表的自定义类。
编辑2:
我测试了 DataContractSerializer 的速度,将 65 个返回实体的列表写入一个简单的内存流大约需要 15 秒。这看起来很荒谬,我不确定是什么改变了让它变得如此缓慢。