Silverlight流式上传

5
我有一个需要上传大文件到服务器的Silverlight应用程序。我已经查看了使用WebClient和HttpWebRequest进行上传,但是我没有找到显而易见的方法来使用这两个选项中的任何一个流式传输上传。由于文件的大小,加载整个内容到内存中然后上传是不切实际的。这在Silverlight中可行吗?

这是一个非常好的问题,但很遗憾我没有一个好的答案。我们所讨论的文件有多大?+1 - AnthonyWJones
有一些 wav 文件可能会达到大约 150+ 兆字节。 - herbrandson
2个回答

1

在Silverlight中,WebClient未能提供一种通过进度事件将流传输到服务器的方法似乎是非常不寻常的。尤其令人惊讶的是,对于字符串上传,它竟然提供了这个功能!

使用HttpWebRequest可以编写代码来实现您想要的功能。

BeginGetRequestStream的回调中,您可以获取用于传出请求的流,然后从文件流中读取块并将它们写入输出流。不幸的是,Silverlight直到关闭输出流后才开始向服务器发送输出。我不知道所有这些数据在此期间存储在哪里,如果它变得足够大,SL可能会使用临时文件以避免过度使用机器内存,但另一方面它可能仍然将所有数据存储在内存中。

唯一可能的解决方案是通过套接字编写HTTP协议。


我稍微思考了一下套接字的问题,发现 Silverlight 套接字无法连接到 80 端口(只能连接 4502 到 4534 端口)。 - herbrandson

1
你可以采用“分块”方法。Codeplex上的Silverlight文件上传程序就使用了这种技术:

http://www.codeplex.com/SilverlightFileUpld

给定一个块大小(例如10k、20k、100k等),您可以将文件分割并使用HTTP请求将每个块发送到服务器。服务器将需要处理每个块并在每个块到达时重新组装文件。在Web农场场景中,当存在多个Web服务器时,请注意不要在Web服务器上使用本地文件系统来进行此方法。


有没有想法如何在服务器端(例如WCF)持久化“块”,并重新组装? - atconway
1
我使用了两种技术:1)在每个块到达时将其保存为文件系统中的文件,然后在所有块都被写入后按正确顺序重新组装文件;2)将每个块保存为二进制数据存储在数据库中,然后重新组装。如果您的网站跨多个Web服务器进行负载平衡,则需要使用第二种技术或某种分布式文件系统。 - kindohm
由于我的文件系统位置与WCF服务器位于同一台服务器上,且它不是负载平衡服务器,因此我认为方案#1非常适合。您有写入块和重新组装的示例吗?您会使用哪种读取器/编写器?感谢您的帮助。 - atconway

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接