我正在使用 WCF 服务引用绑定到现有的 ASMX Web 服务。我有一个方法,它返回一个包含 500k 长度的字符串的 DataSet 对象。
作为标准的“老式”网络参考,调用此方法大约需要 2-3 秒才能完成。作为 WCF 服务参考,这需要 20 多秒才能完成。这现在对我们的系统产生了影响:(
我尝试更改绑定以最大化所有 maxReceivedMessageSize 和 maxBytesPerRead 等,但它没有任何区别。
为什么 WCF 引用这么慢,我该怎么做才能解决这个问题?
我正在使用 WCF 服务引用绑定到现有的 ASMX Web 服务。我有一个方法,它返回一个包含 500k 长度的字符串的 DataSet 对象。
作为标准的“老式”网络参考,调用此方法大约需要 2-3 秒才能完成。作为 WCF 服务参考,这需要 20 多秒才能完成。这现在对我们的系统产生了影响:(
我尝试更改绑定以最大化所有 maxReceivedMessageSize 和 maxBytesPerRead 等,但它没有任何区别。
为什么 WCF 引用这么慢,我该怎么做才能解决这个问题?
这里似乎有一些问题。
首先,除非另有配置,否则 WCF 服务是有状态的,必须在每个新连接上激活。由于身份验证的额外往返行程,SSL 会减慢此激活速度。由于上面导致的问题/建议之一,尝试建立初始连接,然后尝试执行该方法 10 次左右并测量后续调用所需的时间,在初始调用之后应该会快得多。事实上,根据 MS的说法,WCF 在处理调用方面比“老派”的 ASMX 更有效,但仍然受制于激活时间。
接下来,WCF 在后台发生了一些疯狂的序列化操作,并且不能很好地与 DataSet 对象配合使用,因为 DataSet 对象具有大量的开销和元数据。如果必须使用更大的数据集,则应将流的序列化更改为 MTOM 或二进制(但这仅在您的客户端也是基于 WCF/.NET 的情况下才有效)。另一种选择是不使用 DataSet,这可能是 WCF 的最佳选择。 这是一篇关于序列化数据集速度的有趣文章的链接。
参考:
您确实需要查看许多方面,尤其是您在数据量方面进行同类比较。可能还有其他因素导致减速。
我的第一个问题是您为什么将其更改为 WCF?这是否有特定原因 - 我知道这是正确的方法,但是否有特定原因意味着现在需要更改?界面是否有任何可能产生广泛影响的变化。
由于对象处理,WCF 可能会稍微慢一些,但它不应该有这种差异。这一切都表明环境中的其他东西才是真正的问题。
正在使用什么类型的绑定?有BasicHttpBinding和WSHttpBinding,模拟asmx推荐使用BasicHttpBinding。一般来说,WCF 至少应该与它们的 asmx 对应物相媲美。如果这没有帮助,请尝试调整 WCF 的并发设置和实例化模式。