/// <summary> /// Opens progress windows, opens http channel, sends request for file download, saves file and tidies up. /// </summary> /// <param name="client">Client that sent the file.</param> /// <param name="filename">File that will be downloaded from service.</param> public void PrepareForFile(SharedComponents.Client client, string filename) { _viewModel.OpenProgressWindow(); _viewModel.FileWindowModel.FileNameLabel = filename; Thread thread = new Thread(() => { string[] address = _viewModel.ConnectionIP.Split(':'); string fileServicePath = "/WPFHost/http"; var fileEndAdd = new EndpointAddress("http://" + address[0] + ":" + (int.Parse(address[1]) + 1111) + fileServicePath); var fileBinding = new BasicHttpBinding("httpBinding"); _fileChannel = new FileTransferWcfClient(fileBinding, fileEndAdd); try { // start service client _fileChannel.Open(); _fileChannel.SetProxy(_fileChannel.ChannelFactory.CreateChannel()); // kill target file, if already exists // get stream from server Stream inputStream; long length = _fileChannel.DownloadFile(ref filename, out inputStream); string filePath = Path.Combine("Download", filename); // write server stream to disk using (FileStream writeStream = new FileStream(filePath, FileMode.CreateNew, FileAccess.Write)) { int chunkSize = 2048; byte[] buffer = new byte[chunkSize]; _viewModel.FileWindowModel.ProgressMax = length; do { // read bytes from input stream int bytesRead = inputStream.Read(buffer, 0, chunkSize); if (bytesRead == 0) break; // write bytes to output stream writeStream.Write(buffer, 0, bytesRead); // report progress from time to time _viewModel.FileWindowModel.Progress = writeStream.Position; } while (true); writeStream.Close(); Thread threadClose = new Thread(() => { _viewModel.FileWindowModel.DoneLabel = "Done"; // _viewModel.CloseProgressWindow(); }); threadClose.SetApartmentState(ApartmentState.STA); threadClose.Start(); } // close service client //inputStream.Close(); _fileChannel.Close(); _channel.DeleteFileAsync(client, Path.Combine("Upload", filename)); } catch (Exception ex) { _viewModel.Name = ex.ToString(); } }); thread.Start(); }