You basically have 2 options of uploading files to the Silverlight Streaming services, either you use the application management page over at silverlight.live.com or you could use the WebDAV API and upload files via your own code.
To upload through the website you need to zip up the contents of your application and upload the entire zip file in one go. It's an absolute nail biting experience when trying to upload a 50MB file from my connection cause I know that all it takes is one little hiccup and I have to reupload EVERYTHING again.
Using the WebDAV API you can basically write a program that can upload all the files in your Silverlight application one by one onto the services, the advantage of doing so is of course you only have to reupload failed files in case of failure.
But one problem which I was having was that I kept getting an idle disconnection error whenever my upload took more than 5 minutes, and since I'm now uploading video files which are much much bigger than 2MB this was a problem. I thought it was my code but after refering to the WebDAV sample I realised that my code was similar to the sample.
Finally after testing out some more fixes and theories I think I finally found out what the problem was. So in relation to the sample provided I did the following changes.
- Instead of reading the entire file and then writing it to the request stream in one go, I pushed chunks of it say... 64kB chunks at a time.
- Set readwritetimeout and timeout of the HTTPWebRequest object to integer.maxvalue (which basically means infinite timeout..... somehow I don't think this is such a good idea or really has anything to do with the actual problem, will test it with a more practical value and see)
- and most importantly HTTPWebRequest.SendChunked was set to true.
Setting SendChunked to true immediatelly allowed me to spend 80 minutes uploading a 25MB file so I think that should be the main thing to concentrate on.
After some discussions with Bill Reiss over at the Silverlight forums it seems like SendChunked is not the best way to get it to work. Setting AllowWriteStreamBuffering to FALSE and Preauthenticate to TRUE seems to work just as well, and seems to be faster too!