我有一个需要上传大文件到服务器的Silverlight应用程序。我已经查看了使用WebClient和HttpWebRequest进行上传,但是我没有找到显而易见的方法来使用这两个选项中的任何一个流式传输上传。由于文件的大小,加载整个内容到内存中然后上传是不切实际的。这在Silverlight中可行吗?
在Silverlight中,WebClient未能提供一种通过进度事件将流传输到服务器的方法似乎是非常不寻常的。尤其令人惊讶的是,对于字符串上传,它竟然提供了这个功能!
使用HttpWebRequest可以编写代码来实现您想要的功能。
在BeginGetRequestStream
的回调中,您可以获取用于传出请求的流,然后从文件流中读取块并将它们写入输出流。不幸的是,Silverlight直到关闭输出流后才开始向服务器发送输出。我不知道所有这些数据在此期间存储在哪里,如果它变得足够大,SL可能会使用临时文件以避免过度使用机器内存,但另一方面它可能仍然将所有数据存储在内存中。
唯一可能的解决方案是通过套接字编写HTTP协议。
http://www.codeplex.com/SilverlightFileUpld
给定一个块大小(例如10k、20k、100k等),您可以将文件分割并使用HTTP请求将每个块发送到服务器。服务器将需要处理每个块并在每个块到达时重新组装文件。在Web农场场景中,当存在多个Web服务器时,请注意不要在Web服务器上使用本地文件系统来进行此方法。