Click here to Skip to main content
15,896,539 members
Articles / Web Development / ASP.NET

Sending Files in Chunks with MTOM Web Services and .NET 2.0

Rate me:
Please Sign up or sign in to vote.
4.93/5 (177 votes)
23 Nov 2007CPOL15 min read 3.5M   12.5K   405  
How to send large files across web services in small chunks using MTOM (WSE 3)
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;

namespace UploadWinClient
{


	public partial class TaskPanel : Panel
	{
		public List<TaskPanelItem> List = new List<TaskPanelItem>();
		private Point NextPanelPoint = new Point(0, 0);
		private int TaskPanelItemHeight = 70;
		public bool RemoveItemsWhenFinished = false;
		public bool RemoveItemsOnError = false;
		public bool AutoSizeForm = true;

		public TaskPanel()
		{
			InitializeComponent();
			this.TaskPanelItemHeight = new TaskPanelItem().Height;
		}

		/// <summary>
		/// Add a task to the panel.  The icon for 'processing' is not set until StartOperation is called
		/// </summary>
		/// <param name="op"></param>
		public void AddOperation(TaskPanelOperation op)
		{
			lock(this)
			{
				System.Diagnostics.Debug.WriteLine(String.Format("Adding panel with guid {0} for task {1}", op.Guid, op.Text));
				// add the item to the end of the form
				TaskPanelItem p = new TaskPanelItem(op);
				op.Status = TaskStatus.Waiting;
				p.Anchor = AnchorStyles.Top | AnchorStyles.Left | AnchorStyles.Right;
				p.Location = NextPanelPoint;
				p.Width = this.Width - 30;
				this.Controls.Add(p);
				List.Add(p);

				if(AutoSizeForm && this.List.Count > 1)	// && this.Parent is Form && (this.Parent as Form).WindowState != FormWindowState.Minimized)
				{
					// increase the size of the form
					this.Parent.Height = Math.Min(550, 80 + TaskPanelItemHeight * this.List.Count);//this.Parent.Height + TaskPanelItemHeight);
				}
				NextPanelPoint.Y += TaskPanelItemHeight;
			}
		}

		delegate void StartOperationDelegate(string Guid);
		public void StartOperation(string Guid)
		{
			if(this.InvokeRequired)
			{
				Invoke(new StartOperationDelegate(this.StartOperation), new object[] { Guid});
				return;
			} 
			lock(this)
			{
				TaskPanelItem tp = (this.Controls["pnl" + Guid.Replace("-", "")] as TaskPanelItem);
				if(tp == null)
				{
					System.Diagnostics.Debug.WriteLine("Error task panel item not found for guid " + Guid);
					return;
				}
				tp.op.Status = TaskStatus.Running;
				tp.pictureBox1.Image = this.imageList1.Images[0];
				tp.progressBar1.Visible = true;
			}
		}

		delegate void EndOperationDelegate(string Guid, Exception ex);
		public void EndOperation(string Guid, Exception ex)
		{
			if(this.InvokeRequired)
			{
				Invoke(new EndOperationDelegate(this.EndOperation), new object[] { Guid, ex });
				return;
			}
			lock(this)
			{
				System.Diagnostics.Debug.WriteLine(String.Format("Removing panel with guid {0}", Guid));

				TaskPanelItem tp = (this.Controls["pnl" + Guid.Replace("-", "")] as TaskPanelItem);
				if(tp == null)
				{
					System.Diagnostics.Debug.WriteLine("Error task panel item not found for guid " + Guid);
					return;
				}
				tp.progressBar1.Visible = false;

				if(ex == null)	// set the icon to complete
				{
					tp.op.Status = TaskStatus.Success;
					tp.pictureBox1.Image = this.imageList1.Images[1];
					tp.lblStatus.Text = "Complete";
				}
				else
				{
					tp.op.Status = TaskStatus.Failed;
					tp.pictureBox1.Image = this.imageList1.Images[2];
					tp.lblStatus.Text = ex.Message;
				}

				if(!this.RemoveItemsWhenFinished)	// leave the task as it is
					return;
				else if(!this.RemoveItemsOnError && ex != null)	// there is an error, and the task should not be removed.
					return;

				// remove from the array list
				TaskPanelItem itemToRemove = null;
				int i = 0;	// store the position of the removed item, so we can move all items below, up one position
				foreach(TaskPanelItem item in List)
				{
					i++;
					if(item.op.Guid == Guid)
					{
						itemToRemove = item;
						break;
					}
				}
				if(itemToRemove != null)
				{
					List.Remove(itemToRemove);
					i--;
				}

				// remove the panel from the user interface
				Control ToRemove = null;
				foreach(Control c in this.Controls)
				{
					if(c.Name == "pnl" + Guid.Replace("-", ""))
					{
						ToRemove = c;
						break;
					}
				}
				if(ToRemove != null)
					this.Controls.Remove(ToRemove);

				// decrement the next panel point
				NextPanelPoint.Y -= TaskPanelItemHeight;

				// move items below up one position.  "i" holds the index of the panel to start moving up
				for(int j = i; j < List.Count; j++)
				{
					string pnlName = "pnl" + List[j].op.Guid.Replace("-", "");
					if(this.Controls[pnlName] == null)
						continue;
					else
						this.Controls[pnlName].Top -= TaskPanelItemHeight;
				}
			}
		}

		delegate void ProgressChangedDelegate(string Guid, int ProgressPercentage, string Message);
		public void ProgressChanged(string Guid, int ProgressPercentage, string Message)
		{
			if(this.InvokeRequired)
			{
				Invoke(new ProgressChangedDelegate(this.ProgressChanged), new object[] { Guid, ProgressPercentage, Message });
				return;
			}
			string ControlName = "pnl" + Guid.Replace("-", "");
			if(this.Controls[ControlName] == null)
				return;
			TaskPanelItem item = this.Controls[ControlName] as TaskPanelItem;
			item.lblStatus.Text = Message;
			if(ProgressPercentage > 0 && ProgressPercentage < item.progressBar1.Maximum)
			{
				item.progressBar1.Value = ProgressPercentage;
				item.progressBar1.Visible = (Message.ToLower().IndexOf("waiting") < 0);
			}
		}
	}
}

By viewing downloads associated with this article you agree to the Terms of Service and the article's licence.

If a file you wish to view isn't highlighted, and is a text file (not binary), please let us know and we'll add colourisation support for it.

License

This article, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)


Written By
Web Developer
Ireland Ireland
This member has not yet provided a Biography. Assume it's interesting and varied, and probably something to do with programming.

Comments and Discussions