【发布时间】:2010-05-20 20:17:09
【问题描述】:
由于历史原因,我有一些 WSE 3.0 Web 服务我还不能在服务器端升级到 WCF(这也是大量的工作)。
这些网络服务用于从客户端到服务器的文件传输,使用 MTOM 编码。出于兼容性的原因,这也不能在短期内改变。其次,它们是从 Java 和 .NET 调用的,因此需要跨平台,因此需要 MTOM。
它的工作原理是客户端调用“上传”WebMethod,一次发送一大块数据,因为正在传输的文件可能有千兆字节的大小。
但是,由于无法在调用 WebMethod 之前控制部分堆栈,我无法控制 Web 服务的内存使用模式。
我遇到的问题是文件大小从 50MB 左右开始,由于 GC,性能绝对会被杀死,因为 WSE 3.0 似乎将从客户端接收到的每个块缓冲在一个新的 byte[] 数组中,并且通过当我们完成 50MB 的时间时,我们将 20-30% 的时间用于 GC。
我玩过各种大小的块,从 16k 到 2MB,结果并没有太大差异。
较小的块被往返所涉及的延迟杀死,而较大的块只是推迟减速直到 GC 启动。
在减少 WSE 产生的垃圾方面有什么好主意吗?我是否可以以某种方式插入管道并临时装配可以访问客户端请求流并将其流式传输到 WebMethod 的东西?
我知道可以使用 WSE 将响应“流式传输”到客户端(尽管非常难看),但这个问题出在客户端的请求上。
【问题讨论】:
-
另外,在 IIS7 上使用经典模式很糟糕 :)
标签: c# wcf web-services