摘要:最近在对一个项目进行重构,由于项目采用的是Web Services与服务器通讯,所以传输效率一直是一个很头痛的问题,特别是在大数据量的时候,于是提高WS的传输速度就作为重构的一个重要目标之一.
我一共设想了三个方法:
1. 尽量避免SOAP格式序列化,这点虽然我没有验证过,但是我感觉相对与BASE64编码来说,SOAP编码的处理会更加复杂,所以,首先把所有要传输的对象全部通过BinaryFommatter序列化成二进制流,通过byte[]参数的方式传递,WS会将byte[]编码为BASE64,在另一段接收到之后再反序列化.这样还有个额外的好处,就是可以传递本来WS不允许的一些对象,比如DataTable.
2.如果只采用第一个方法,可能效果不明显,所以将序列化后的二进制流用GZIP算法实时压缩后再发送(相应在另一端必须实现首先进行解压缩后再进行反序列化),这一步应该是提高速度的关键,一般数据在压缩后会变成原来的十分之一还不到,在经过这两步之后,速度已经提高到原来的7-8倍,根据我的实测,在2M的ADSL上如果采用原来的方式传递一个1000行数据的DataSet需要3秒,改进后只需要要0.5秒.如果在连接速度更低的网络环境下,效率可能会有更大的改善.
3.假如数据量太大,即使压缩后也很夸张,那么还可以跳过BASE64编码,直接使用二进制流的方式传递数据,要达到这点需要借用WSE中的Attachment功能,将压缩数据包作为一个附件上传.不过这种方式只是我的设想,我并没有这么做过,因为我的服务器端将来可能会使用LINUX,但我还没测试过MONO能不能支持WSE(估计是不能吧).
可能会有人说这种方式不能跟异构平台通信,比如J2EE,那确实是没办法了,因为我从来就没考虑过要和J2EE连接....[
阅读全文]