public void Process(UnicornSyncBeginPipelineArgs args)
        {
            var serializationProvider = args.Configuration.Resolve <ISerializationProvider>();
            var logger = args.Configuration.Resolve <ILogger>();

            var remotingSerializationProvider = serializationProvider as IRemotingSerializationProvider;

            if (remotingSerializationProvider == null)
            {
                return;
            }

            // get package
            if (string.IsNullOrWhiteSpace(remotingSerializationProvider.RemoteUrl))
            {
                logger.Error("Remoting URL was not set on " + remotingSerializationProvider.GetType().Name + "; cannot update remote.");
                args.AbortPipeline();
                return;
            }

            if (HttpContext.Current != null && HttpContext.Current.Request.Url.Host.Equals(new Uri(remotingSerializationProvider.RemoteUrl).Host, StringComparison.OrdinalIgnoreCase))
            {
                logger.Warn("Remoting: Remote URL was local instance - skipping this configuration as it is by definition already synced.");
                args.SyncIsHandled = true;
                return;
            }

            var lastLoaded = GetLastLoadedTime(args.Configuration.Name);

            // if you pass the force parameter, we do not use the history engine differential sync
            if (remotingSerializationProvider.DisableDifferentialSync || (HttpContext.Current != null && HttpContext.Current.Request.QueryString["force"] != null))
            {
                lastLoaded = _unsyncedDateTimeValue;
            }

            var url = string.Format("{0}?c={1}&ts={2}", remotingSerializationProvider.RemoteUrl, args.Configuration.Name, lastLoaded);

            var webClient = new SuperWebClient();

            // TODO; add signature to request

            RemotingPackage package = null;

            try
            {
                logger.Info("Remoting: Downloading updated items from {0} newer than {1}".FormatWith(remotingSerializationProvider.RemoteUrl, lastLoaded.ToLocalTime()));

                var tempFileName = HostingEnvironment.MapPath("~/temp/" + Guid.NewGuid() + ".zip");

                try
                {
                    webClient.DownloadFile(url, tempFileName);
                    using (var stream = File.OpenRead(tempFileName))
                    {
                        package = RemotingPackage.FromStream(stream);
                    }
                }
                finally
                {
                    if (File.Exists(tempFileName))
                    {
                        File.Delete(tempFileName);
                    }
                }

                WritePackageToProvider(package, args.Configuration);

                if (package.Manifest.Strategy == RemotingStrategy.Differential)
                {
                    logger.Info("Remoting: received differential package with {0} changes. Replaying instead of sync.".FormatWith(package.Manifest.HistoryEntries.Length));

                    var replayer = new DifferentialPackageReplayer(package);

                    if (!replayer.Replay(logger))
                    {
                        logger.Error("Remoting package replay signalled an error. Aborting.");
                        args.AbortPipeline();
                        return;
                    }
                    else
                    {
                        args.SyncIsHandled = true;
                    }
                }
                else
                {
                    logger.Info("Remoting: received full package from remote. Deployed and executing sync.");
                }

                SetLastLoadedTime(args.Configuration.Name, package.Manifest.LastSynchronized);
            }
            finally
            {
                // clean up temp files
                if (package != null)
                {
                    package.Dispose();
                }
            }
        }
		public void Process(UnicornSyncBeginPipelineArgs args)
		{
			var serializationProvider = args.Configuration.Resolve<ISerializationProvider>();
			var logger = args.Configuration.Resolve<ILogger>();

			var remotingSerializationProvider = serializationProvider as IRemotingSerializationProvider;
			if (remotingSerializationProvider == null) return;

			// get package
			if (string.IsNullOrWhiteSpace(remotingSerializationProvider.RemoteUrl))
			{
				logger.Error("Remoting URL was not set on " + remotingSerializationProvider.GetType().Name + "; cannot update remote.");
				args.AbortPipeline();
				return;
			}

			if (HttpContext.Current != null && HttpContext.Current.Request.Url.Host.Equals(new Uri(remotingSerializationProvider.RemoteUrl).Host, StringComparison.OrdinalIgnoreCase))
			{
				logger.Warn("Remoting: Remote URL was local instance - skipping this configuration as it is by definition already synced.");
				args.SyncIsHandled = true;
				return;
			}

			var lastLoaded = GetLastLoadedTime(args.Configuration.Name);

			// if you pass the force parameter, we do not use the history engine differential sync
			if (remotingSerializationProvider.DisableDifferentialSync || (HttpContext.Current != null && HttpContext.Current.Request.QueryString["force"] != null))
			{
				lastLoaded = _unsyncedDateTimeValue;
			}

			var url = string.Format("{0}?c={1}&ts={2}", remotingSerializationProvider.RemoteUrl, args.Configuration.Name, lastLoaded);

			var webClient = new SuperWebClient();

			// TODO; add signature to request

			RemotingPackage package = null;

			try
			{
				logger.Info("Remoting: Downloading updated items from {0} newer than {1}".FormatWith(remotingSerializationProvider.RemoteUrl, lastLoaded.ToLocalTime()));

				var tempFileName = HostingEnvironment.MapPath("~/temp/" + Guid.NewGuid() + ".zip");

				try
				{
					webClient.DownloadFile(url, tempFileName);
					using (var stream = File.OpenRead(tempFileName))
					{
						package = RemotingPackage.FromStream(stream);
					}
				}
				finally
				{
					if (File.Exists(tempFileName)) File.Delete(tempFileName);
				}

				WritePackageToProvider(package, args.Configuration);

				if (package.Manifest.Strategy == RemotingStrategy.Differential)
				{
					logger.Info("Remoting: received differential package with {0} changes. Replaying instead of sync.".FormatWith(package.Manifest.HistoryEntries.Length));

					var replayer = new DifferentialPackageReplayer(package);

					if (!replayer.Replay(logger))
					{
						logger.Error("Remoting package replay signalled an error. Aborting.");
						args.AbortPipeline();
						return;
					}
					else args.SyncIsHandled = true;
				}
				else
				{
					logger.Info("Remoting: received full package from remote. Deployed and executing sync.");
				}

				SetLastLoadedTime(args.Configuration.Name, package.Manifest.LastSynchronized);
			}
			finally
			{
				// clean up temp files
				if(package != null) package.Dispose();
			}
		}