近日,随公司的Silverlight项目进展,需要开发文件上传的功能,大致含 文件批量上传、压缩、界面友好 等要求。回想起我在2009年底使用Silverlight 3.0+WCF在VS2008 SP1的环境下开发过文件上传功能,当时就发现在Silverlight端将byte[]数据传递至WCF端时,一旦byte[]大于16KB,WCF端就拒绝接收返回Not Found错误,而且Silverlight端不管怎么配置都不管用,无奈之下只得将WCF服务分成两类,一类用于一次性写入小于16KB的文件;一类用于先创建16KB的文件头,然后再每次写入16KB的数据直至文件写入完成。于是这次开发首先便要突破这个16KB的限制,遂于CSDN上发贴求助,得到了冷秋寒等大虾的大力帮助,不胜感激,难得又到了周末,便把开发过程中的总结贴出来与众人分享,当然总结仅是一家之言,缺乏理论依据支持,还望诸大虾拍砖指正。
1. 使用 HttpHandler+WebClient 还是使用 WCF?
一开始就考虑过是否要使用Http+WebClient,这还是因为WCF的16KB限制,考虑到如果WCF每次只能接收16KB,则一个160KB的Excel文件便要分成10次才能上传完毕,要请求10次WCF服务,既降低了上传速度,又加大了WCF服务器的负担,想必使用Http的文件上传方案由来已久,早有成熟的方案,便向诸大侠请教。后得冷大侠和猛砍赵云兄指点,深夜在Codeplex下载了Silverlight Multi File Uploader 3.0 (http://slfileupload.codeplex.com/releases/view/30368),解压后不禁称奇,因为这个Silverlight Multi File Uploader 3.0中所使用的WCF服务的思路竟然是和我之前写过的WCF极为类似,只不过他简化为只有一类服务,每次只写入16KB的数据,并且通过SL端传入的参数判断是否为第一次写入、是否整个文件写入完成。运行Silverlight Multi File Uploader 3.0,使用Http方式,单次可以上传高达4MB的数据,而使用WCF,也是每次只能上传16KB,难怪该作者在Http方式的页面写道This page uses the HttpUploadHandler.ashx to upload files (faster but not so fancy)。难道只能选择Http方式了?
2. 如何配置WCF?
带着准备要采用Http方式的心,先行开发了文件上传的进度指示器,刚好冷大侠给出了配置WCF的提示,经过测试确定在使用VS2008或VS2010自动生成“启用了Silverlight支持的WCF服务”时,起作用的是maxArrayLength、maxReceivedMessageSize 这两个参数:
<bindings>
<basicHttpBinding>
<binding name="NewBinding0" maxReceivedMessageSize="2147483647" transferMode="Buffered">
<readerQuotas maxArrayLength="1024576" /> <!--1024576 为 1024KB-->
<security mode="None" />
</binding>
</basicHttpBinding>
<customBinding>
<binding name="customBinding0">
<