예제 #1
0
        public async Task SendRows <T>(string DataExtensionExternalKey, List <T> list)
        {
            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            await InsertRows(DataExtensionExternalKey, list);
        }
예제 #2
0
파일: Content.cs 프로젝트: iqdamn/SFMC4NET
        public async Task <ContentCategories> GetContentFolders(string parentFolderId = null)
        {
            ContentCategories categories = null;
            string            serviceURL = this.ContentURL + FolderResource + "?$pagesize=" + PageSize;

            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            ServiceHandler serviceHandler = new ServiceHandler();
            string         result         = await serviceHandler.InvokeRESTServiceNoBody(serviceURL, accessToken);

            categories = ParseContentFolderServiceOutput(result);

            //Checking if more calls are required because the paging
            if (categories != null && categories.Items != null && categories.Items.Count < categories.Count)
            {
                ContentCategories overallCategories = new ContentCategories();
                overallCategories.Items = new System.Collections.Generic.List <Category>();

                overallCategories.Items.AddRange(categories.Items);
                overallCategories.Count = categories.Count;

                //The last call should have zero items, this indicates no more pages are available
                while (categories.Items.Count != 0)
                {
                    int pageToRequest = (int)(categories.Page + 1);
                    serviceURL += "&$page=" + pageToRequest;

                    //Because we are iterating, it's better to check if the token is still valid, with OAuth 2.0 the token only lasts 1079 seconds
                    if (accessToken == null || !accessToken.IsValid)
                    {
                        BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                        accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
                    }

                    result = await serviceHandler.InvokeRESTServiceNoBody(serviceURL, accessToken);

                    categories = ParseContentFolderServiceOutput(result);

                    if (categories == null)
                    {
                        break;
                    }

                    overallCategories.Items.AddRange(categories.Items);
                }

                categories = overallCategories;
            }

            return(categories);
        }
예제 #3
0
파일: Content.cs 프로젝트: iqdamn/SFMC4NET
        public async Task <string> CreateFolder(string parentId, string name)
        {
            string resultId   = string.Empty;
            string serviceURL = this.ContentURL + FolderResource;

            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            RestClient  client  = new RestClient(serviceURL);
            RestRequest request = new RestRequest(Method.POST);

            request.AddHeader("Accept", "application/json");
            request.AddParameter("Authorization", "Bearer " + accessToken.Token, ParameterType.HttpHeader);

            StringBuilder message = new StringBuilder();

            message.Append("{\"Name\":\"" + name + "\",\"ParentId\":" + parentId + "}");

            request.AddParameter("application/json", message.ToString(), ParameterType.RequestBody);

            //Using Polly Retry policy
            var policy = Policy.Handle <WebException>()
                         .Or <HttpRequestException>()
                         .OrResult <IRestResponse>(r => r.StatusCode != HttpStatusCode.Created)
                         .RetryAsync(3);

            var policyResult = await policy.ExecuteAndCaptureAsync(() => client.ExecuteTaskAsync(request));

            string serviceResult;

            if (policyResult.Outcome == OutcomeType.Successful)
            {
                IRestResponse webResponse = policyResult.Result;
                serviceResult = webResponse.Content;

                Dictionary <string, string> responseObj = JsonConvert.DeserializeObject <Dictionary <string, string> >(serviceResult);

                if (responseObj != null)
                {
                    resultId = responseObj["id"];
                }
            }
            else
            {
                throw new System.Exception($"{policyResult.FinalHandledResult.Content}");
            }

            return(resultId);
        }
예제 #4
0
        private async Task <string> GetStartAutomationRequestMessage(AutomationInfo automationInfo)
        {
            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            StringBuilder builder = new StringBuilder();

            builder.Append($"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header><fueloauth xmlns=\"http://exacttarget.com\">{accessToken.Token}</fueloauth></s:Header>");
            builder.Append("<s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><PerformRequestMsg xmlns=\"http://exacttarget.com/wsdl/partnerAPI\">");
            builder.Append($"<Options/><Action>start</Action><Definitions><Definition xsi:type=\"Automation\"><PartnerKey xsi:nil=\"true\"/><ObjectID>{automationInfo.ObjectID}</ObjectID></Definition></Definitions>");

            builder.Append("</PerformRequestMsg></s:Body></s:Envelope>");

            return(builder.ToString());
        }
예제 #5
0
파일: Events.cs 프로젝트: iqdamn/SFMC4NET
        public async Task <string> TriggerEvent(Event customEvent)
        {
            string instanceId = string.Empty;

            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            //Setting up the request
            RestRequest request = new RestRequest(Method.POST);

            request.AddHeader("Accept", "application/json");
            request.AddParameter("Authorization", "Bearer " + accessToken.Token, ParameterType.HttpHeader);

            RestClient client = new RestClient(EventsURL);

            request.AddParameter("application/json", customEvent.ToJson(), ParameterType.RequestBody);

            //Using Polly Retry policy
            var policy = Policy.Handle <WebException>()
                         .Or <HttpRequestException>()
                         .OrResult <IRestResponse>(r => r.StatusCode != HttpStatusCode.Created)
                         .RetryAsync(3);

            var policyResult = await policy.ExecuteAndCaptureAsync(() => client.ExecuteTaskAsync(request));

            Dictionary <string, string> result;

            if (policyResult.Outcome == OutcomeType.Successful)
            {
                IRestResponse webResponse = policyResult.Result;
                result = JsonConvert.DeserializeObject <Dictionary <string, string> >(webResponse.Content);
            }
            else
            {
                throw new System.Exception($"{policyResult.FinalHandledResult.Content}");
            }

            instanceId = result["eventInstanceId"];

            return(instanceId);
        }
예제 #6
0
        private async Task <string> GetScheduleAutomationRequestMessage(AutomationInfo automationInfo)
        {
            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            StringBuilder builder = new StringBuilder();

            builder.Append($"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header><fueloauth xmlns=\"http://exacttarget.com\">{accessToken.Token}</fueloauth></s:Header>");
            builder.Append("<s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><ScheduleRequestMsg xmlns=\"http://exacttarget.com/wsdl/partnerAPI\">");
            builder.Append($"<Options/><Action>start</Action><Interactions><Interaction xsi:type=\"Automation\"><PartnerKey xsi:nil=\"true\"/><ObjectID>{automationInfo.ObjectID}</ObjectID></Interaction></Interactions>");
            builder.Append($"<Schedule><StartDateTime>{DateTime.Now.ToString("yyyy-MM-ddTHH:mm:ss")}</StartDateTime><RecurrenceType>Hourly</RecurrenceType><RecurrenceRangeType>EndOn</RecurrenceRangeType><Occurrences>2</Occurrences></Schedule>");
            builder.Append($"<ScheduleOptions>{DateTime.Now.AddDays(1).ToString("yyyy-MM-ddTHH:mm:ss")}</ScheduleOptions>");
            builder.Append("</ScheduleRequestMsg></s:Body></s:Envelope>");

            return(builder.ToString());
        }
예제 #7
0
        public async Task <string> CreateAsset(Asset asset)
        {
            string serviceURL = this.BaseRESTURL + AssetsResource;
            string result     = string.Empty;
            string url        = string.Empty;

            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            RestClient  client  = new RestClient(serviceURL);
            RestRequest request = new RestRequest(Method.POST);

            request.AddHeader("Accept", "application/json");
            request.AddParameter("Authorization", "Bearer " + accessToken.Token, ParameterType.HttpHeader);

            request.AddJsonBody(asset);

            var policy = Policy.Handle <WebException>()
                         .Or <HttpRequestException>()
                         .OrResult <IRestResponse>(r => r.StatusCode != HttpStatusCode.Created)
                         .RetryAsync(3);

            var policyResult = await policy.ExecuteAndCaptureAsync(() => client.ExecuteTaskAsync(request));

            if (policyResult.Outcome == OutcomeType.Successful)
            {
                IRestResponse webResponse = policyResult.Result;
                result = webResponse.Content;

                //extracting url from response
                JObject jObject = JObject.Parse(result);
                url = (string)jObject.SelectToken("$['fileProperties']['publishedURL']");
            }
            else
            {
                throw new System.Exception($"{policyResult.FinalHandledResult.Content}");
            }

            return(url);
        }
예제 #8
0
        public async Task <AutomationInfo> GetAutomationInfo(string automationExternalKey)
        {
            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            StringBuilder builder = new StringBuilder();

            builder.Append($"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header><fueloauth xmlns=\"http://exacttarget.com\">{accessToken.Token}</fueloauth></s:Header>");
            builder.Append("<s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><RetrieveRequestMsg xmlns=\"http://exacttarget.com/wsdl/partnerAPI\"><RetrieveRequest>");
            builder.Append($"<ObjectType>Automation</ObjectType><Properties>ProgramID</Properties><Properties>Status</Properties><Properties>Name</Properties><Properties>CustomerKey</Properties><Filter xsi:type=\"SimpleFilterPart\"><Property>CustomerKey</Property><SimpleOperator>equals</SimpleOperator><Value>{automationExternalKey}</Value></Filter>");

            builder.Append("</RetrieveRequest></RetrieveRequestMsg></s:Body></s:Envelope>");

            ServiceHandler client   = new ServiceHandler();
            string         response = await client.InvokeSOAPService(builder.ToString(), this.serviceURL);

            return(GetAutomationInfoFromResponse(response));
        }
예제 #9
0
        private async Task <string> CreateDataExtensionRequestMessage(DataExtension dataExtension)
        {
            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            StringBuilder builder = new StringBuilder();

            builder.Append($"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header><fueloauth xmlns=\"http://exacttarget.com\">{accessToken.Token}</fueloauth></s:Header>");
            builder.Append("<s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><CreateRequest xmlns=\"http://exacttarget.com/wsdl/partnerAPI\">");
            builder.Append($"<Options></Options><Objects xmlns:ns1=\"http://exacttarget.com/wsdl/partnerAPI\" xsi:type=\"ns1:DataExtension\"><CustomerKey>{dataExtension.CustomerKey}</CustomerKey>");

            if (dataExtension.FolderId != 0)
            {
                builder.Append($"<CategoryID>{dataExtension.FolderId}</CategoryID>");
            }

            builder.Append($"<Name>{dataExtension.Name}</Name><IsSendable>false</IsSendable><Fields>");

            foreach (DataExtensionColumn column in dataExtension.Columns)
            {
                builder.Append($"<Field><CustomerKey>{column.Name}</CustomerKey>");
                builder.Append($"<Name>{column.Name}</Name><FieldType>{column.InferedType}</FieldType><IsRequired>{(!column.IsNullable).ToString().ToLower()}</IsRequired>");

                if (column.InferedType == DataType.Text)
                {
                    builder.Append($"<MaxLength>{column.MaxLength}</MaxLength>");
                }

                builder.Append($"</Field>");
            }

            builder.Append("</Fields></Objects></CreateRequest></s:Body></s:Envelope>");

            return(builder.ToString());
        }
예제 #10
0
파일: Content.cs 프로젝트: iqdamn/SFMC4NET
        public async Task <bool> DoesFolderExist(string id)
        {
            bool   exists     = false;
            string serviceURL = this.ContentURL + FolderResource + $"/{id}";

            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            ServiceHandler serviceHandler = new ServiceHandler();
            string         result         = await serviceHandler.InvokeRESTServiceNoBody(serviceURL, accessToken);

            if (!string.IsNullOrEmpty(result))
            {
                if (result.Contains(id))
                {
                    exists = true;
                }
            }

            return(exists);
        }
예제 #11
0
        /// <summary>
        /// Generates the request message to be send in the SOAP call
        /// </summary>
        /// <returns>The generated request message</returns>
        private async Task <string> GetRequestMessage <T>(string DataExtensionExternalKey, RequestParameters parameter = null)
        {
            if (accessToken == null || !accessToken.IsValid)
            {
                BearerToken tokenBuilder = new BearerToken(AuthenticationURL);
                accessToken = await tokenBuilder.GetAccessToken(this.clientId, this.secret);
            }

            StringBuilder builder = new StringBuilder();

            builder.Append($"<s:Envelope xmlns:s=\"http://schemas.xmlsoap.org/soap/envelope/\"><s:Header><fueloauth xmlns=\"http://exacttarget.com\">{accessToken.Token}</fueloauth></s:Header>");
            builder.Append("<s:Body xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\"><RetrieveRequestMsg xmlns=\"http://exacttarget.com/wsdl/partnerAPI\">");
            builder.Append($"<RetrieveRequest><ObjectType>DataExtensionObject[{DataExtensionExternalKey}]</ObjectType>");

            if (parameter != null && !string.IsNullOrEmpty(parameter.RequestId))
            {
                builder.Append($"<ContinueRequest>{parameter.RequestId}</ContinueRequest>");
            }

            //Let's get all the properties
            PropertiesManager propertiesManager = new PropertiesManager();

            foreach (string prop in propertiesManager.GetDataExtensionFields <T>())
            {
                builder.Append($"<Properties>{prop}</Properties>");
            }

            if (parameter != null && !string.IsNullOrEmpty(parameter.Filter))
            {
                builder.Append(parameter.Filter);
            }

            builder.Append("</RetrieveRequest></RetrieveRequestMsg></s:Body></s:Envelope>");

            return(builder.ToString());
        }