示例#1
0
        internal static XConnectClientConfiguration GenerateCFG(XdbModel xdbModel)
        {
            XConnectClientConfiguration toReturn = null;

            var CertificateThumbprint = ConfigurationManager.AppSettings.Get("CertificateThumbprint");

            if (!string.IsNullOrEmpty(CertificateThumbprint))
            {
                var options = CertificateHttpClientHandlerModifierOptions.Parse(Const.XConnect.CertificateStorePrefix + CertificateThumbprint);

                var certificateModifier = new CertificateHttpClientHandlerModifier(options);

                List <IHttpClientModifier> clientModifiers = new List <IHttpClientModifier>();

                var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
                clientModifiers.Add(timeoutClientModifier);

                var odataUri                   = new Uri(MarketingConst.XConnect.EndPoints.Odata);
                var ConfigurationUri           = new Uri(MarketingConst.XConnect.EndPoints.Configuration);
                var httpClientHandlerModifiers = new[] { certificateModifier };

                var collectionClient    = new CollectionWebApiClient(odataUri, clientModifiers, httpClientHandlerModifiers);
                var searchClient        = new SearchWebApiClient(odataUri, clientModifiers, httpClientHandlerModifiers);
                var configurationClient = new ConfigurationWebApiClient(ConfigurationUri, clientModifiers, httpClientHandlerModifiers);

                toReturn = new XConnectClientConfiguration(new XdbRuntimeModel(xdbModel), collectionClient, searchClient, configurationClient);
            }
            else
            {
                Console.WriteLine("Missing certificate thumbprint. Re: example config");
            }

            return(toReturn);
        }
        public XConnectClientConfiguration GetCFG(XdbModel xdbModel)
        {
            var options = CertificateHttpClientHandlerModifierOptions.Parse(CollectionConst.XConnect.Certificate.CertificateStore + CollectionConst.XConnect.Certificate.CertificateThumbprint);

            var certificateModifier = new CertificateHttpClientHandlerModifier(options);

            List <IHttpClientModifier> clientModifiers = new List <IHttpClientModifier>();

            var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));

            clientModifiers.Add(timeoutClientModifier);

            var collectionClient = new CollectionWebApiClient(new Uri(CollectionConst.XConnect.EndPoints.Odata),

                                                              clientModifiers, new[] { certificateModifier });

            var searchClient = new SearchWebApiClient(new Uri(CollectionConst.XConnect.EndPoints.Odata),

                                                      clientModifiers, new[] { certificateModifier }
                                                      );

            var configurationClient = new ConfigurationWebApiClient(new Uri(CollectionConst.XConnect.EndPoints.Configuration),
                                                                    clientModifiers, new[] { certificateModifier });

            var cfg = new XConnectClientConfiguration(
                new XdbRuntimeModel(xdbModel),
                collectionClient, searchClient, configurationClient);

            return(cfg);
        }
示例#3
0
        private static async Task <XConnectClient> GetXConnectClient()
        {
            // Valid certificate thumbprints must be passed in
            var options =
                CertificateHttpClientHandlerModifierOptions.Parse($"StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue=55AAF36E6508E0670F2B11F67371993C9EB8428D");

            // Optional timeout modifier
            var certificateModifier = new CertificateHttpClientHandlerModifier(options);

            var clientModifiers       = new List <IHttpClientModifier>();
            var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 60));

            clientModifiers.Add(timeoutClientModifier);

            // This overload takes three client end points - collection, search, and configuration
            var collectionClient    = new CollectionWebApiClient(new Uri("https://xp930.xconnect/odata"), clientModifiers, new[] { certificateModifier });
            var searchClient        = new SearchWebApiClient(new Uri("https://xp930.xconnect/odata"), clientModifiers, new[] { certificateModifier });
            var configurationClient = new ConfigurationWebApiClient(new Uri("https://xp930.xconnect/configuration"), clientModifiers, new[] { certificateModifier });

            XdbModel[] models = { CollectionModel.Model, Custom.Foundation.Xdb.Models.FormsModel.Model };

            var cfg = new XConnectClientConfiguration(
                new XdbRuntimeModel(models), collectionClient, searchClient, configurationClient);

            await cfg.InitializeAsync();

            return(new XConnectClient(cfg));
        }
示例#4
0
        private CertificateHttpClientHandlerModifier GetCertificateWebRequestHandlerModifier(
            string connectionStringName)
        {
            string certificateOptionsSettingValue = Configuration.GetConnectionString(connectionStringName);
            CertificateHttpClientHandlerModifierOptions options =
                CertificateHttpClientHandlerModifierOptions.Parse(certificateOptionsSettingValue);

            return(new CertificateHttpClientHandlerModifier(options));
        }
示例#5
0
        /// <summary>
        /// Gets the handler configurations for the Reference Data client
        /// </summary>
        /// <param name="thumbprint"></param>
        /// <returns></returns>
        public virtual IEnumerable <IHttpClientHandlerModifier> GetReferenceDataHandlers(string thumbprint)
        {
            // Valid certificate thumbprints must be passed in
            var options = CertificateHttpClientHandlerModifierOptions.Parse("StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue=" + thumbprint);

            // Optional timeout modifier
            IHttpClientHandlerModifier[] handlers = { new CertificateHttpClientHandlerModifier(options) };

            return(handlers);
        }
        public static async Task <XConnectClient> Create()
        {
            const string XCONNECT_ENDPOINT_KEY = "xconnect.collection";

            var connectionStrings = WebConfigurationManager.ConnectionStrings;
            var endpoint          = connectionStrings[XCONNECT_ENDPOINT_KEY]?.ConnectionString;

            Uri endpointUri;

            if (!Uri.TryCreate(endpoint, UriKind.Absolute, out endpointUri))
            {
                throw new Exception($"Endpoint to xConnect has not been specified.  The key name must be [{XCONNECT_ENDPOINT_KEY}]");
            }

            CollectionWebApiClient      collectionClient;
            SearchWebApiClient          searchClient;
            ConfigurationWebApiClient   configurationClient;
            XConnectClientConfiguration cfg;

            var certificate = connectionStrings["xconnect.collection.certificate"]?.ConnectionString;

            List <IHttpClientModifier> modifiers = null;

            CertificateHttpClientHandlerModifier[] certificateModifiers = null;

            //if a certificate was specified in config
            if (string.IsNullOrEmpty(certificate) == false)
            {
                var certOptions = CertificateHttpClientHandlerModifierOptions.Parse(certificate);
                certificateModifiers = new[] { new CertificateHttpClientHandlerModifier(certOptions) };
                modifiers            = new List <IHttpClientModifier>()
                {
                    new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20))
                };
            }

            collectionClient    = new CollectionWebApiClient(new Uri(endpointUri, "odata/"), modifiers, certificateModifiers);
            searchClient        = new SearchWebApiClient(new Uri(endpointUri, "odata/"), modifiers, certificateModifiers);
            configurationClient = new ConfigurationWebApiClient(new Uri(endpointUri, "configuration/"), modifiers, certificateModifiers);
            cfg = new XConnectClientConfiguration(new XdbRuntimeModel(ModelFactory.Model), collectionClient, searchClient, configurationClient, true);

            await cfg.InitializeAsync();

            return(new XConnectClient(cfg));
        }
        public async Task <XConnectClientConfiguration> CreateAndConfigureClient()
        {
            XConnectClientConfiguration cfg = null;

            try
            {
                CertificateHttpClientHandlerModifierOptions options = CertificateHttpClientHandlerModifierOptions.Parse(CollectionConst.XConnect.Certificate.CertificateStore + CollectionConst.XConnect.Certificate.CertificateThumbprint);

                var certificateModifier = new CertificateHttpClientHandlerModifier(options);

                List <IHttpClientModifier> clientModifiers = new List <IHttpClientModifier>();

                var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
                clientModifiers.Add(timeoutClientModifier);

                var collectionClient = new CollectionWebApiClient(new Uri(CollectionConst.XConnect.EndPoints.Odata), clientModifiers, new[]
                {
                    certificateModifier
                });

                var searchClient = new SearchWebApiClient(new Uri(CollectionConst.XConnect.EndPoints.Odata), clientModifiers, new[] {
                    certificateModifier
                });

                var configurationClient = new ConfigurationWebApiClient(new Uri(CollectionConst.XConnect.EndPoints.Configuration), clientModifiers, new[] { certificateModifier });

                cfg = new XConnectClientConfiguration(new XdbRuntimeModel(CollectionModel.Model), collectionClient, searchClient, configurationClient);

                await cfg.InitializeAsync();

                DisplayXConnectResult();
            }
            catch (XdbModelConflictException ce)
            {
                Console.WriteLine("Error: " + ce.Message);
            }

            return(cfg);
        }
示例#8
0
        /// <summary>
        /// Builds a client configuration object for connecting to xConnect.
        /// Includes certificate and timeout modifiers, and sets up client connections.
        /// </summary>
        /// <param name="collectionHost">The host name where the collection endpoint is located</param>
        /// <param name="searchHost">The host name where the search endpoint is located</param>
        /// <param name="configHost">The host name where configuration info should be retrieved</param>
        /// <param name="thumbprint">The thumbprint for the certificate to connect with</param>
        /// <returns>A new configuration instance</returns>
        public virtual XConnectClientConfiguration GetClientConfiguration(string collectionHost, string searchHost, string configHost, string thumbprint)
        {
            //Set up the certificate used to connect to xConnect endpoints
            var options             = CertificateHttpClientHandlerModifierOptions.Parse("StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue=" + thumbprint);
            var certificateModifier = new CertificateHttpClientHandlerModifier(options);

            //Set up timeout modifier for the client
            var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
            var clientModifiers       = new List <IHttpClientModifier>
            {
                timeoutClientModifier
            };

            //Initialize the clients. Each requires the certificate in order to open the connection
            var collectionClient    = new CollectionWebApiClient(new Uri(collectionHost + "/odata"), clientModifiers, new[] { certificateModifier });
            var searchClient        = new SearchWebApiClient(new Uri(searchHost + "/odata"), clientModifiers, new[] { certificateModifier });
            var configurationClient = new ConfigurationWebApiClient(new Uri(configHost + "/configuration"), clientModifiers, new[] { certificateModifier });

            //Create the configuration object with all clients
            var cfg = new XConnectClientConfiguration(
                new XdbRuntimeModel(CollectionModel.Model), collectionClient, searchClient, configurationClient);

            return(cfg);
        }
        private static async Task MainAsync(string[] args)
        {
            Console.WriteLine("Which environment do you wish to connect to? 1=LocalDev, 2=Other");
            Console.WriteLine();
            Console.WriteLine("1 = LocalDev");
            Console.WriteLine("2 = Other");
            var environment = Console.ReadLine();

            string xConnectUrlBase;
            string thumbPrint;

            #region configurehttp
            switch (environment)
            {
            case "1":
            {
                Console.WriteLine("Configuring LocalDev connection");
                xConnectUrlBase = "https://dev93.xconnect";
                thumbPrint      = "66405B1051BCA6DB0BC3576640A09648E1292812";
                break;
            }

            case "2":
            {
                Console.WriteLine("Other");
                xConnectUrlBase = "[your xConnect URL here]";
                thumbPrint      = "[your thumbprint here]";
                break;
            }

            default:
            {
                Console.WriteLine("Nothing to see here");
                xConnectUrlBase = "???";
                thumbPrint      = "???";
                return;
            }
            }

            CertificateHttpClientHandlerModifierOptions options = CertificateHttpClientHandlerModifierOptions.Parse($"StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue={thumbPrint}");

            var certificateModifier = new CertificateHttpClientHandlerModifier(options);

            List <IHttpClientModifier> clientModifiers = new List <IHttpClientModifier>();
            var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));
            clientModifiers.Add(timeoutClientModifier);

            // Ensure configuration pointing to appropriate instance of xconnect
            var collectionClient    = new CollectionWebApiClient(new Uri($"{xConnectUrlBase}/odata"), clientModifiers, new[] { certificateModifier });
            var searchClient        = new SearchWebApiClient(new Uri($"{xConnectUrlBase}/odata"), clientModifiers, new[] { certificateModifier });
            var configurationClient = new ConfigurationWebApiClient(new Uri($"{xConnectUrlBase}/configuration"), clientModifiers, new[] { certificateModifier });

            // For exisitng facets
            //XdbModel[] models = { CollectionModel.Model };
            // For custom Facets
            XdbModel[] models = { CollectionModel.Model, CustomerCollectionModel.Model };

            //var cfg = new XConnectClientConfiguration(new XdbRuntimeModel(models), collectionClient, searchClient, configurationClient);
            var cfg = new XConnectClientConfiguration(new XdbRuntimeModel(models), collectionClient, searchClient, configurationClient, true);
            try
            {
                await cfg.InitializeAsync();
            }
            catch (XdbModelConflictException ce)
            {
                Console.WriteLine("ERROR:" + ce.Message);
                return;
            }
            #endregion

            Console.WriteLine("What action are you performing?");
            Console.WriteLine("1=Update Contact Facet");
            Console.WriteLine("2=Create contact with values");
            var action = Console.ReadLine();

            switch (action)
            {
            case "1":
            {
                Console.WriteLine("Enter an xDB contact ID. You can keep this empty to update facets based on email.");
                var contactId = Console.ReadLine();
                Console.WriteLine("First name?");
                var firstName = Console.ReadLine();
                Console.WriteLine("Last name?");
                var lastName = Console.ReadLine();
                Console.WriteLine("Email Address?");
                var email = Console.ReadLine();
                Console.WriteLine("Country code?");
                var countryCode = Console.ReadLine();
                Console.WriteLine("Mobile number?");
                var mobileNumber = Console.ReadLine();
                Console.WriteLine("Customer Status?");
                var customerStatus = Console.ReadLine();
                await UpdateContactFacet(cfg, contactId, firstName, lastName, email, countryCode, mobileNumber, customerStatus);

                break;
            }

            case "2":
            {
                Console.WriteLine("First name?");
                var firstName = Console.ReadLine();
                Console.WriteLine("Last name?");
                var lastName = Console.ReadLine();
                Console.WriteLine("Email Address?");
                var email = Console.ReadLine();
                Console.WriteLine("Country code?");
                var countryCode = Console.ReadLine();
                Console.WriteLine("Mobile number?");
                var mobileNumber = Console.ReadLine();
                Console.WriteLine("Customer Status?");
                var customerStatus = Console.ReadLine();
                await CreateContacts(cfg, firstName, lastName, email, countryCode, mobileNumber, customerStatus);

                break;
            }

            default:
            {
                return;
            }
            }
            Console.WriteLine();
            Console.ReadLine();
        }
        private async Task Register(PipelineArgs arg)
        {
            CertificateHttpClientHandlerModifierOptions options =
                CertificateHttpClientHandlerModifierOptions.Parse("StoreName=My;StoreLocation=LocalMachine;FindType=FindByThumbprint;FindValue=" + Constants.XConnectThumbprint);

            var certificateModifier = new CertificateHttpClientHandlerModifier(options);

            List <IHttpClientModifier> clientModifiers = new List <IHttpClientModifier>();
            var timeoutClientModifier = new TimeoutHttpClientModifier(new TimeSpan(0, 0, 20));

            clientModifiers.Add(timeoutClientModifier);

            var collectionClient    = new CollectionWebApiClient(new Uri(Constants.XConnectInstance + "/odata"), clientModifiers, new[] { certificateModifier });
            var searchClient        = new SearchWebApiClient(new Uri(Constants.XConnectInstance + "/odata"), clientModifiers, new[] { certificateModifier });
            var configurationClient = new ConfigurationWebApiClient(new Uri(Constants.XConnectInstance + "/configuration"), clientModifiers, new[] { certificateModifier });

            var cfg = new XConnectClientConfiguration(
                new XdbRuntimeModel(ProductTrackingModel.Model), collectionClient, searchClient, configurationClient);


            foreach (var interactionEvent in arg.ProcessingResult.Interaction.Interaction.Events)
            {
                if (interactionEvent.CustomValues != null && interactionEvent.CustomValues.Count > 0)
                {
                    var name      = interactionEvent.CustomValues["name"].Split(' ');
                    var firstName = name[0] != null ? name[0] : "Not Available";
                    var lastName  = name.Length > 1 ? name[1] : "Not Available";

                    var twitterHandle        = interactionEvent.CustomValues["twitterhandle"];
                    var twitterHandleCreated = Convert.ToDateTime(interactionEvent.CustomValues["twitterhandlecreated"]);
                    var numberOfFollowers    = Convert.ToInt32(interactionEvent.CustomValues["followerscount"]);
                    var tweetfulltext        = interactionEvent.CustomValues["tweetfulltext"];
                    var hashtag = interactionEvent.CustomValues["hashtags"];

                    await cfg.InitializeAsync();

                    using (var client = new XConnectClient(cfg))
                    {
                        try
                        {
                            ContactIdentifier contactIdentifier = new ContactIdentifier("twitter", twitterHandle, ContactIdentifierType.Known);

                            // Let's just save this for later
                            //TODO: If time check for existing user.
                            Identifier = contactIdentifier.Identifier;
                            Contact contact = new Contact(contactIdentifier);

                            //TODO Get from args custom values "Name". If space save first and last
                            PersonalInformation personalInfo = new PersonalInformation()
                            {
                                FirstName = firstName,
                                LastName  = lastName
                            };


                            // TODO get from args
                            TwitterAccountInfo visitorInfo = new TwitterAccountInfo()
                            {
                                TwitterHandle         = twitterHandle,
                                TwitterStartDate      = twitterHandleCreated,
                                NumberOfFollowers     = numberOfFollowers,
                                VerifiedTwitterHandle = false
                            };

                            client.AddContact(contact);
                            client.SetFacet(contact, TwitterAccountInfo.DefaultFacetKey, visitorInfo);
                            client.SetFacet(contact, PersonalInformation.DefaultFacetKey, personalInfo);

                            var interaction = new Interaction(contact, InteractionInitiator.Contact, arg.ProcessingResult.Interaction.Interaction.ChannelId, ""); // GUID should be from a channel item in Sitecore

                            //TODO Get from args

                            var productTweet = new ProductTweet();
                            productTweet.Tweet          = tweetfulltext;
                            productTweet.ProductHashtag = hashtag;
                            productTweet.TwitterHandle  = twitterHandle;

                            ITextAnalyticsClient cogClient = new TextAnalyticsClient(new ApiKeyServiceClientCredentials())
                            {
                                Endpoint = "https://westus.api.cognitive.microsoft.com"
                            };

                            SentimentBatchResult result = cogClient.SentimentAsync(
                                new MultiLanguageBatchInput(
                                    new List <MultiLanguageInput>()
                            {
                                new MultiLanguageInput("en", new Guid().ToString(), productTweet.Tweet)
                            })).Result;

                            if (result != null && result.Documents.Any())
                            {
                                var firstDocument = result.Documents.First();
                                if (firstDocument != null)
                                {
                                    productTweet.Sentiment = firstDocument.Score;
                                }
                            }

                            interaction.Events.Add(new ProductReviewOutcome(productTweet, DateTime.UtcNow));
                            client.AddInteraction(interaction);
                            await client.SubmitAsync();
                        }
                        catch (XdbExecutionException ex)
                        {
                            // Deal with exception
                            Logger.LogInformation("Tres Divas Twitter Interactions EnrichmentPipelineProcessor: ", ex);
                        }
                    }
                }
            }
        }