近来因为项目需要,我们要做一个像分布式的文件存储一样的方案.所以上网来找了一下资料,常见的解决方案有如下两种:
1.将文件内容转换成一个Base64编码的字符串.然后调用WebServices或者.Net Remoting 的传输方法.
2.将文件读到字节数组中,然后传输.
应该说,这两种方案可以解决大多数的需求 ,可是我总觉得不够理想.将一个5M以上的文件转成Base64编码的String,我觉得不可思议,同样,将一个5M的文件读到内存,10个Request就是50M,100个就是500M,这一个,也不太能接收.
我希望能有一种更好的解决方案.可是,Stream继承自MarshalByRefObject,是不能直接传输的.我想了很久,终于有了一点灵感,Stream是继承是MarshalByRefObject的,也就是说,我们可以在客户端调Stream的代理.比如上传文件,我们可以先在服务器端执行FileStream fs=new FileStream(config.SavePath+fileName,FileMode.Create),然后将fs的代理传给客户端,这时客户端调用fs.Write(byte),这时内容应该被写到了服务器上了.读取的,同理.
当然,做为一个为多个应用程序服务的基础服务,返回一个Stream是不合理的.我们应该封装一个Helper方法,来为其它程序服务.
这目前仅仅是一个想法,明天实践一下.
我相信,应该会有更优秀的解决方案.