views:

415

answers:

2

I have a Silverlight application that needs to upload large files to the server. I've looked at uploading using both WebClient as well a HttpWebRequest, however I don't see an obvious way stream the upload with either option. Do to the size of the files, loading the entire contents into memory before uplaoding is not reasonable. Is this possible in Silverlight?

+1  A: 

It does seem extraordinary that the WebClient in Silverlight fails to provide a means to pump a Stream to the server with progress events. Its especially amazing since this is offered for a string upload!

It is possible to code what would be appear to be doing what you want with a HttpWebRequest.

In the call back for BeginGetRequestStream you can get the Stream for the outgoing request and then read chunks from your file's Stream and write them to the output stream. Unfortunately Silverlight does not start sending the output to the server until the output stream has been closed. Where all this data ends up being stored in the meantime I don't know, its possible that if it gets large enough SL might use a temporary file so as not to stress the machines memory but then again it might just store it all in memory anyway.

The only solution to this that might be possible is to write the HTTP protocol via sockets.

AnthonyWJones
I throught a little about sockets and the issue is that Silverlight sockets can't connect to port 80 (only 4502 to 4534)
herbrandson
+1  A: 

You could go with a "chunking" approach. The Silverlight File Uploader on Codeplex uses this technique:

http://www.codeplex.com/SilverlightFileUpld

Given a chunk size (e.g. 10k, 20k, 100k, etc), you can split up the file and send each chunk to the server using an HTTP request. The server will need to handle each chunk and re-assemble the file as each chunk arrives. In a web farm scenario when there are multiple web servers - be careful to not use the local file system on the web server for this approach.

Mike Hodnick