private static ClientCredentials RegisterDevice(Guid applicationId, Uri issuerUri, LiveDevice device)
        {
            var environment = DiscoverEnvironmentInternal(issuerUri);
            var request     = new DeviceRegistrationRequest(applicationId, device);
            var url         = string.Format(CultureInfo.InvariantCulture, LiveIdConstants.RegistrationEndpointUriFormat, environment.HostName);
            var response    = ExecuteRegistrationRequest(url, request);

            if (!response.IsSuccess)
            {
                var throwException = true;
                if (DeviceRegistrationErrorCode.DeviceAlreadyExists == response.Error.RegistrationErrorCode)
                {
                    if (!PersistToFile)
                    {
                        return(device.User.ToClientCredentials());
                    }

                    if (PersistIfDeviceAlreadyExists)
                    {
                        throwException = false;
                    }
                }

                if (throwException)
                {
                    throw new DeviceRegistrationFailedException(response.Error.RegistrationErrorCode, response.ErrorSubCode);
                }
            }

            if (PersistToFile || PersistIfDeviceAlreadyExists)
            {
                WriteDevice(environment, device);
            }

            return(device.User.ToClientCredentials());
        }
        private static DeviceRegistrationResponse ExecuteRegistrationRequest(string url, DeviceRegistrationRequest registrationRequest)
        {
            var request = WebRequest.Create(url);

            request.ContentType = "application/soap+xml; charset=UTF-8";
            request.Method      = "POST";
            request.Timeout     = 180000;

            // ToDo: async
            using (var stream = request.GetRequestStream())
            {
                Serialize(stream, registrationRequest);
            }

            try
            {
                using (var response = request.GetResponse())
                    using (var stream = response.GetResponseStream())
                    {
                        return(Deserialize <DeviceRegistrationResponse>("Deserializing Registration Response", stream));
                    }
            }
            catch (WebException ex)
            {
                System.Diagnostics.Trace.TraceError("Microsoft account Device Registration Failed (HTTP Code: {0}): {1}", ex.Status, ex.Message);

                if (ex.Response != null)
                {
                    using (var stream = ex.Response.GetResponseStream())
                    {
                        return(Deserialize <DeviceRegistrationResponse>("Deserializing Failed Registration Response", stream));
                    }
                }

                throw;
            }
        }