/// <summary>
        /// Override process method.
        /// </summary>
        public override void Process()
        {
            bool      unhandledExceptionDetected = true;
            Exception exceptionCaught            = null;

            try
            {
                RealTimeEndpoint   innerEndpoint = this.LocalEndpoint.InnerEndpoint;
                SendMessageOptions options       = new SendMessageOptions();
                options.ContentDescription = ContactCenterDiscoveryAsyncResult.GetDiscoveryRequestContentDescription();
                RealTimeAddress targetAddress = new RealTimeAddress(this.TargetUri);
                innerEndpoint.BeginSendMessage(MessageType.Service, targetAddress, options, this.ServiceRequestCompleted, innerEndpoint /*state*/);
                unhandledExceptionDetected = false;
            }
            catch (ArgumentException ae)
            {
                Helper.Logger.Error("Exception = {0}", EventLogger.ToString(ae));
                exceptionCaught            = ae;
                unhandledExceptionDetected = false;
            }
            catch (InvalidOperationException ioe)
            {
                Helper.Logger.Info("Exception = {0}", EventLogger.ToString(ioe));
                exceptionCaught            = ioe;
                unhandledExceptionDetected = false;
            }
            catch (RealTimeException rte)
            {
                Helper.Logger.Info("Exception = {0}", EventLogger.ToString(rte));
                exceptionCaught            = rte;
                unhandledExceptionDetected = false;
            }
            finally
            {
                if (unhandledExceptionDetected)
                {
                    exceptionCaught = new Exception("Unhandled exception");
                    Helper.Logger.Info("Exception = {0}", EventLogger.ToString(exceptionCaught));
                }

                if (exceptionCaught != null)
                {
                    this.Complete(exceptionCaught);
                }
            }
        }
        /// <summary>
        /// Callback method for service completed.
        /// </summary>
        /// <param name="asyncResult">Async result.</param>
        private void ServiceRequestCompleted(IAsyncResult asyncResult)
        {
            RealTimeEndpoint innerEndpoint = asyncResult.AsyncState as RealTimeEndpoint;

            Debug.Assert(null != innerEndpoint, "Inner endpoint is null");
            bool      unhandledExceptionDetected = true;
            Exception exceptionCaught            = null;
            ContactCenterInformation result      = null;

            try
            {
                SipResponseData serviceResponse = innerEndpoint.EndSendMessage(asyncResult);
                byte[]          responseBody    = serviceResponse.GetMessageBody();

                if (responseBody != null)
                {
                    result = ContactCenterDiscoveryAsyncResult.DeserializeResponseData(responseBody);
                }

                if (result == null)
                {
                    //Deserialziation failed.
                    exceptionCaught = new XmlException("Deserialization of queue uri mapping failed");
                }
                unhandledExceptionDetected = false;
            }
            catch (XmlException xe)
            {
                exceptionCaught            = xe;
                unhandledExceptionDetected = false;
            }
            catch (ArgumentException ae)
            {
                exceptionCaught            = ae;
                unhandledExceptionDetected = false;
            }
            catch (RealTimeException rte)
            {
                exceptionCaught            = rte;
                unhandledExceptionDetected = false;
            }
            finally
            {
                if (unhandledExceptionDetected)
                {
                    exceptionCaught = new Exception("Unhandled exception");
                    Helper.Logger.Info("Exception = {0}", EventLogger.ToString(exceptionCaught));
                }

                if (exceptionCaught != null)
                {
                    Helper.Logger.Error("Exception = {0}", EventLogger.ToString(exceptionCaught));
                    this.Complete(exceptionCaught);
                }
                else
                {
                    Debug.Assert(null != result, "If no exception occured, we expect a valid result");
                    this.Complete(result);
                }
            }
        }