コード例 #1
0
        public void LocalCrmDatabaseOrganizationServiceExecuteTests_ExecuteErrorTransactionRequest()
        {
            var account = new Id <Account>("576E11B7-193A-4B80-A39A-1BF6ECD22A51");
            var request = new ExecuteTransactionRequest
            {
                Requests = new OrganizationRequestCollection
                {
                    new CreateRequest {
                        Target = account
                    },
                    new CreateRequest {
                        Target = account
                    }
                },
                ReturnResponses = true
            };
            var service = GetService();

            try
            {
                service.Execute(request);
            }
            catch (FaultException <OrganizationServiceFault> ex)
            {
                Assert.AreEqual("Cannot insert duplicate key", ex.Message);
                Assert.AreEqual("Cannot insert duplicate key", ex.Detail.Message);
                Assert.AreEqual(1, ((ExecuteTransactionFault)ex.Detail).FaultedRequestIndex);
            }
        }
コード例 #2
0
        public void LocalCrmDatabaseOrganizationServiceExecuteTests_ExecuteTransactionRequest()
        {
            var account = new Id <Account>("576E11B7-193A-4B80-A39A-1BF6ECD27A51");
            var contact = new Id <Contact>("A40249BF-637A-4AB9-A944-3C2506D12F18");
            var request = new ExecuteTransactionRequest
            {
                Requests = new OrganizationRequestCollection
                {
                    new CreateRequest {
                        Target = account
                    },
                    new CreateRequest {
                        Target = contact
                    }
                },
                ReturnResponses = true
            };
            var service  = GetService();
            var response = (ExecuteTransactionResponse)service.Execute(request);

            AssertCrm.Exists(service, account);
            AssertCrm.Exists(service, contact);
            Assert.AreEqual(response.Responses.Count, 2);

            service.Delete(account.Entity);
            service.Delete(contact.Entity);

            request.ReturnResponses = false;
            response = (ExecuteTransactionResponse)service.Execute(request);
            Assert.AreEqual(response.Responses.Count, 0);
        }
コード例 #3
0
 /// <summary>
 /// Update a collection of records
 /// </summary>
 /// <param name="colecao"></param>
 public void UpdateCollection(EntityCollection colecao)
 {
     //If quantity up to batchSize limmit do one by one, else use one transaction request
     if (colecao.Entities.Count > 1000)
     {
         foreach (Entity registro in colecao.Entities)
         {
             Repositorio.RepositorioEntity.Instancia.Atualizar(registro, Guid.Empty);
         }
     }
     else
     {
         var requestGroup = new ExecuteTransactionRequest()
         {
             Requests = new OrganizationRequestCollection(), ReturnResponses = false
         };
         foreach (Entity registro in colecao.Entities)
         {
             var updateRequest = new UpdateRequest()
             {
                 Target = registro
             };
             requestGroup.Requests.Add(updateRequest);
         }
         Repositorio.RepositorioEntity.Instancia.Execute(requestGroup);
     }
 }
コード例 #4
0
        private void UpdateContacts(EntityCollection contacts, Entity contact)
        {
            if (contacts == null)
            {
                return;
            }
            if (contact == null)
            {
                return;
            }
            ExecuteTransactionRequest multipleRequest = new ExecuteTransactionRequest {
                Requests        = new OrganizationRequestCollection(),
                ReturnResponses = true
            };

            foreach (Entity existingContact in contacts.Entities)
            {
                contact[Attributes.Contact.ContactId] = existingContact.Id;
                var updateRequest = new UpdateRequest {
                    Target = contact
                };
                multipleRequest.Requests.Add(updateRequest);
                if (multipleRequest.Requests.Count == 500)
                {
                    payloadCustomer.Response = CommonXrm.BulkUpdate(multipleRequest, crmService);
                    multipleRequest.Requests.Clear();
                }
            }
            if (multipleRequest.Requests.Count > 0)
            {
                payloadCustomer.Response = CommonXrm.BulkUpdate(multipleRequest, crmService);
            }
        }
コード例 #5
0
        /// <summary>
        /// Method to update multiple record.
        /// </summary>
        /// <param name="records"></param>
        public void UpdateMultiple(EntityCollection records)
        {
            var requestToUpdateRecords = new ExecuteTransactionRequest()
            {
                // Create an empty organization request collection.
                Requests        = new OrganizationRequestCollection(),
                ReturnResponses = false
            };

            if (records != null && records.Entities != null)
            {
                int requests = 0;
                foreach (var entity in records.Entities)
                {
                    UpdateRequest updateRequest = new UpdateRequest {
                        Target = entity
                    };
                    requestToUpdateRecords.Requests.Add(updateRequest);
                    requests++;

                    // Maximum batch size of execute multiple = 1000.
                    if (requests >= 1000)
                    {
                        this._service.Execute(requestToUpdateRecords);
                        requestToUpdateRecords.Requests.Clear();
                        requests = 0;
                    }
                }
                if (requests > 0)
                {
                    this._service.Execute(requestToUpdateRecords);
                }
            }
        }
コード例 #6
0
        public void When_execute_is_called_all_requests_are_executed_with_responses()
        {
            var context  = new XrmFakedContext();
            var executor = new ExecuteTransactionExecutor();
            var req      = new ExecuteTransactionRequest()
            {
                ReturnResponses = true,
                Requests        = new OrganizationRequestCollection()
                {
                    new CreateRequest()
                    {
                        Target = new Entity("contact")
                    },
                    new CreateRequest()
                    {
                        Target = new Entity("contact")
                    },
                    new CreateRequest()
                    {
                        Target = new Entity("contact")
                    }
                }
            };

            var response = executor.Execute(req, context) as ExecuteTransactionResponse;
            var contacts = context.CreateQuery("contact").ToList();

            Assert.Equal(3, response.Responses.Count);
            Assert.Equal(3, contacts.Count);
        }
コード例 #7
0
        private static void CreateAccountsExecuteTransaction(CrmServiceClient crmSvc)
        {
            // https://msdn.microsoft.com/en-us/library/mt634414.aspx
            ExecuteTransactionRequest executeTransactionRequest = new ExecuteTransactionRequest()
            {
                Requests        = new OrganizationRequestCollection(),
                ReturnResponses = true
            };

            EntityCollection preparedRecords = PrepareRecordsToCreate();

            foreach (var entity in preparedRecords.Entities)
            {
                CreateRequest createRequest = new CreateRequest {
                    Target = entity
                };
                executeTransactionRequest.Requests.Add(createRequest);
            }

            Stopwatch sw = new Stopwatch();

            sw.Start();
            crmSvc.Execute(executeTransactionRequest);
            sw.Stop();
            Console.WriteLine("Creating {0} Accounts took {1}ms", recordsPerBatch, sw.ElapsedMilliseconds);
        }
コード例 #8
0
        public void Commit()
        {
            var requests = new OrganizationRequestCollection();
            var transactionRequest = new ExecuteTransactionRequest
            {
                Requests = new OrganizationRequestCollection()
            };

            Added.ForEach(requests.Add);
            Modified.ForEach(requests.Add);
            Deleted.ForEach(requests.Add);

            Added.Clear();
            Modified.Clear();
            Deleted.Clear();

            try
            {
                for (int i = 0; i < requests.Count; i++)
                {
                    if ((i + 1) % _batchSize != 0)
                    {
                        transactionRequest.Requests.Add(requests[i]);
                    }
                    else
                    {
                        transactionRequest.Requests.Add(requests[i]);
                        var response = _service.Execute(transactionRequest);

                        transactionRequest = new ExecuteTransactionRequest
                        {
                            Requests = new OrganizationRequestCollection()
                        };
                    }

                    if ((i == requests.Count - 1) && transactionRequest.Requests.Count > 0)
                    {
                        var response = _service.Execute(transactionRequest);
                    }
                }
            }
            catch (FaultException<OrganizationServiceFault> fault)
            {
                if (fault.Detail.ErrorDetails.Contains("MaxBatchSize"))
                {
                    int maxBatchSize = Convert.ToInt32(fault.Detail.ErrorDetails["MaxBatchSize"]);
                    if (maxBatchSize < transactionRequest.Requests.Count)
                    {
                        var errMsg =
                            string.Format(
                                "The input request collection contains {0} requests, which exceeds the maximum allowed {1}",
                                transactionRequest.Requests.Count, maxBatchSize);
                        throw new InvalidOperationException(errMsg, fault);
                    }
                }

                throw;
            }
        }
コード例 #9
0
        public async Task <ExecuteTransactionResponse> Handle(ExecuteTransactionRequest request, CancellationToken cancellationToken)
        {
            try
            {
                Log.Information("Transaction execution started. Request: {Request}", JsonConvert.SerializeObject(request));

                var transaction = await _transactionRepository.GetAsync(request.TransactionId);

                if (!CanProcessTransaction(transaction))
                {
                    Log.Warning("The transaction is not available for processing. Request: {Request}", JsonConvert.SerializeObject(request));

                    return(new ExecuteTransactionResponse()
                    {
                        Message = "The transaction is not available for processing", Success = false
                    });
                }

                UpdateTransaction(transaction, eStatus.Processing);

                try
                {
                    if (!CheckBalance(transaction.AccountOrigin, transaction.Value))
                    {
                        var message = "Source account does not have sufficient balance";
                        UpdateTransaction(transaction, eStatus.Error, message);

                        Log.Warning(message + " Request: {Request}", JsonConvert.SerializeObject(request));

                        return(new ExecuteTransactionResponse()
                        {
                            Message = message, Success = false
                        });
                    }

                    ExecuteTransaction(transaction);

                    UpdateTransaction(transaction, eStatus.Confirmed);
                }
                catch (Exception ex)
                {
                    UpdateTransaction(transaction, eStatus.Error, "An unexpected error occurred while executing transaction");
                    throw ex;
                }

                Log.Information("Transaction execution terminated.Request: {Request}", JsonConvert.SerializeObject(request));

                return(new ExecuteTransactionResponse()
                {
                    Message = "Transaction successful", Success = true
                });;
            }
            catch (Exception ex)
            {
                Log.Error(ex, "An unexpected error occurred while executing transaction. Request: {Request}", JsonConvert.SerializeObject(request));
                throw ex;
            }
        }
コード例 #10
0
ファイル: CrmUnitOfWork.cs プロジェクト: michsob/Xrm
        public void Commit()
        {
            var transactionRequest = new ExecuteTransactionRequest
            {
                Requests = new OrganizationRequestCollection()
            };

            foreach (var entity in Added.Keys)
            {
                Added[entity].PersistAdded(entity);
            }
            foreach (var entity in Modified.Keys)
            {
                Modified[entity].PersistUpdated(entity);
            }
            foreach (var entity in Removed.Keys)
            {
                Removed[entity].PersistRemoved(entity);
            }

            Added.Clear();
            Modified.Clear();
            Removed.Clear();

            try
            {
                for (int i = 0; i < Requests.Count; i += _batchSize)
                {
                    var requestBatch = Requests.Skip(i).Take(_batchSize);

                    transactionRequest.Requests.AddRange(requestBatch);
                    _service.Execute(transactionRequest);

                    transactionRequest = new ExecuteTransactionRequest
                    {
                        Requests = new OrganizationRequestCollection()
                    };
                }
            }
            catch (FaultException <OrganizationServiceFault> fault)
            {
                if (fault.Detail.ErrorDetails.Contains("MaxBatchSize"))
                {
                    int maxBatchSize = Convert.ToInt32(fault.Detail.ErrorDetails["MaxBatchSize"]);
                    if (maxBatchSize < transactionRequest.Requests.Count)
                    {
                        var errMsg =
                            string.Format(
                                "The input request collection contains {0} requests, which exceeds the maximum allowed {1}",
                                transactionRequest.Requests.Count, maxBatchSize);
                        throw new InvalidOperationException(errMsg, fault);
                    }
                }

                throw;
            }
        }
コード例 #11
0
        private void InitTransactionRequest()
        {
            _orgProxy.EnableProxyTypes();

            _transactionRequest = new ExecuteTransactionRequest()
            {
                Requests        = new OrganizationRequestCollection(),
                ReturnResponses = true
            };
        }
コード例 #12
0
        public ExecuteTransactionResponse ExecuteTransactionRequests(OrganizationRequestCollection collectionRequests, bool returnResponses = true)
        {
            var request = new ExecuteTransactionRequest
            {
                Requests        = collectionRequests,
                ReturnResponses = returnResponses
            };

            return((ExecuteTransactionResponse)OrganizationService.Execute(request));
        }
コード例 #13
0
        private ExecuteTransactionResponse ExecuteInternal(ExecuteTransactionRequest request)
        {
            var response = new ExecuteTransactionResponse
            {
                Results =
                {
                    ["Responses"] = new OrganizationResponseCollection()
                }
            };

            for (int i = 0; i < request.Requests.Count; i++)
            {
                var childRequest = request.Requests[i];
                OrganizationResponse childResponse = null;
                try
                {
                    if (childRequest.RequestName == "ExecuteMultiple")
                    {
                        throw new Exception("ExecuteMultipleRequest cannot contain an ExecuteMultipleRequest");
                    }

                    childResponse = ExecuteInternal((dynamic)childRequest);
                    if (request.ReturnResponses != true)
                    {
                        childResponse = null;
                    }
                }
                catch (NotImplementedException)
                {
                    throw;
                }
                catch (Exception ex)
                {
                    throw new FaultException <OrganizationServiceFault>(new ExecuteTransactionFault
                    {
                        FaultedRequestIndex = i,
                        Message             = ex.Message,
                        Timestamp           = DateTime.UtcNow,
                        ErrorDetails        =
                        {
                            ["CallStack"] = ex.StackTrace
                        }
                    }, new FaultReason(ex.Message));
                }
                finally
                {
                    if (childResponse != null)
                    {
                        response.Responses.Add(childResponse);
                    }
                }
            }

            return(response);
        }
コード例 #14
0
        public void Execute()
        {
            this.OnExecutionStarted();

            if (this.requestsToExecute.Count > 0)
            {
                var transactionRequest = new ExecuteTransactionRequest();
                transactionRequest.Requests = this.requestsToExecute;
                service.Execute(transactionRequest);
            }

            this.OnExecutionFinished();
        }
コード例 #15
0
ファイル: CrmUnitOfWork.cs プロジェクト: michsob/Xrm
        public void Commit()
        {
            var transactionRequest = new ExecuteTransactionRequest
            {
                Requests = new OrganizationRequestCollection()
            };

            foreach (var entity in Added.Keys)
                Added[entity].PersistAdded(entity);
            foreach (var entity in Modified.Keys)
                Modified[entity].PersistUpdated(entity);
            foreach (var entity in Removed.Keys)
                Removed[entity].PersistRemoved(entity);

            Added.Clear();
            Modified.Clear();
            Removed.Clear();

            try
            {
                for (int i = 0; i < Requests.Count; i += _batchSize)
                {
                    var requestBatch = Requests.Skip(i).Take(_batchSize);

                    transactionRequest.Requests.AddRange(requestBatch);
                    _service.Execute(transactionRequest);

                    transactionRequest = new ExecuteTransactionRequest
                    {
                        Requests = new OrganizationRequestCollection()
                    };
                }
            }
            catch (FaultException<OrganizationServiceFault> fault)
            {
                if (fault.Detail.ErrorDetails.Contains("MaxBatchSize"))
                {
                    int maxBatchSize = Convert.ToInt32(fault.Detail.ErrorDetails["MaxBatchSize"]);
                    if (maxBatchSize < transactionRequest.Requests.Count)
                    {
                        var errMsg =
                            string.Format(
                                "The input request collection contains {0} requests, which exceeds the maximum allowed {1}",
                                transactionRequest.Requests.Count, maxBatchSize);
                        throw new InvalidOperationException(errMsg, fault);
                    }
                }

                throw;
            }
        }
コード例 #16
0
        public void CreateTransaction()
        {
            try
            {
                executeTransactionRequest = new ExecuteTransactionRequest();

                executeTransactionRequest.Requests        = new OrganizationRequestCollection();
                executeTransactionRequest.ReturnResponses = true;
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
コード例 #17
0
        public List <DtoMultipleReponse> Execute(List <ExecuteTransactionRequest> resultList, bool isOnlyErrRes = true)
        {
            List <DtoMultipleReponse> errorResponseList = new List <DtoMultipleReponse>();

            try
            {
                for (int i = 0; i < resultList.Count; i++)
                {
                    ExecuteTransactionRequest  request        = resultList[i] as ExecuteTransactionRequest;
                    ExecuteTransactionResponse responseResult = (ExecuteTransactionResponse)_orgProxy.Execute(request);

                    if (!isOnlyErrRes)
                    {
                        foreach (var responseItem in responseResult.Responses)
                        {
                            if (responseItem.Results.Count > 0)
                            {
                                DtoMultipleReponse dto = new DtoMultipleReponse()
                                {
                                    IsSuccess   = true,
                                    RequestName = responseItem.ResponseName
                                };

                                if ("Create".Equals(responseItem.ResponseName))                                 //Create만 Return Id가 존재하는 듯함
                                {
                                    //dto.RequestId = responseItem.Results["id"].ToString();
                                }
                                errorResponseList.Add(dto);
                            }
                        }
                    }
                }
                return(errorResponseList);
            }
            catch (FaultException <OrganizationServiceFault> ex)
            {
                DtoMultipleReponse dto = new DtoMultipleReponse()
                {
                    IsSuccess           = false,
                    RequestFaultMessage = ex.Detail.Message
                };
                errorResponseList.Add(dto);

                return(errorResponseList);
            }
            catch (Exception e)
            {
                throw e;
            }
        }
コード例 #18
0
        public static XrmUpdateResponse BulkUpdate(ExecuteTransactionRequest multipleRequest, IOrganizationService service)
        {
            if (multipleRequest == null && multipleRequest.Requests == null && multipleRequest.Requests.Count == 0)
            {
                return(null);
            }
            if (service == null)
            {
                return(null);
            }
            ExecuteTransactionResponse multipleResponses = (ExecuteTransactionResponse)service.Execute(multipleRequest);

            return(new XrmUpdateResponse {
                Updated = true, Existing = true
            });
        }
        static void Main()
        {
            var connectionString = "AuthType=Office365;[email protected]; Password=;Url=https://.crm6.dynamics.com";

            var crmSvc = new CrmServiceClient(connectionString);

            using (var serviceProxy = crmSvc.OrganizationServiceProxy)
            {
                //Create request collection
                var request = new OrganizationRequestCollection()
                {
                    new CreateRequest
                    {
                        Target = new Entity("account")
                        {
                            ["name"] = "Packt Account"
                        }
                    },
                    new CreateRequest
                    {
                        Target = new Entity("contact")
                        {
                            ["firstname"] = "Packt",
                            ["lastname"]  = "Contact"
                        }
                    }
                };

                //Create Transaction and pass previously created request collection
                var requestToCreateRecords = new ExecuteTransactionRequest()
                {
                    // Create an empty organization request collection.
                    Requests        = request,
                    ReturnResponses = true
                };

                //Execute requests within the transaction
                var responseForCreateRecords = (ExecuteTransactionResponse)serviceProxy.Execute(requestToCreateRecords);

                // Display the results of each response.
                foreach (var responseItem in responseForCreateRecords.Responses)
                {
                    Console.WriteLine("Created record with GUID {0}", responseItem.Results["id"].ToString());
                }
            }
        }
コード例 #20
0
        public void ApplyRulesToUser(EntityReferenceCollection ec, Guid userId, bool isOutlookFilter)
        {
            var tempUserId = ((CrmServiceClient)service).CallerId;

            ((CrmServiceClient)service).CallerId = userId;

            try
            {
                // TODO ICI
                var existingQueries = service.RetrieveMultiple(new QueryExpression("userquery")
                {
                    Criteria = new FilterExpression
                    {
                        Conditions =
                        {
                            new ConditionExpression("parentqueryid", ConditionOperator.In, ec.Select(e => e.Id).ToArray())
                        }
                    }
                }).Entities;

                var transac = new ExecuteTransactionRequest
                {
                    Requests        = new OrganizationRequestCollection(),
                    ReturnResponses = false
                };

                foreach (var query in existingQueries)
                {
                    transac.Requests.Add(new DeleteRequest {
                        Target = query.ToEntityReference()
                    });
                }

                transac.Requests.Add(new InstantiateFiltersRequest
                {
                    UserId             = userId,
                    TemplateCollection = ec
                });

                service.Execute(transac);
            }
            finally
            {
                ((CrmServiceClient)service).CallerId = tempUserId;
            }
        }
コード例 #21
0
        public void Commit()
        {
            if (requests.Count == 0)
            {
                return;
            }

            var executeTransactionRequest = new ExecuteTransactionRequest
            {
                Requests        = new OrganizationRequestCollection(),
                ReturnResponses = false
            };

            executeTransactionRequest.Requests.AddRange(requests);

            orgService.Execute(executeTransactionRequest);
        }
コード例 #22
0
        public ExecuteTransactionResponse ExecuteTransaction(Dictionary <Entity, RequestType> entityList)
        {
            try
            {
                executeTransactionRequest                 = new ExecuteTransactionRequest();
                executeTransactionRequest.Requests        = new OrganizationRequestCollection();
                executeTransactionRequest.ReturnResponses = true;

                foreach (KeyValuePair <Entity, RequestType> entity in entityList)
                {
                    if (entity.Value == RequestType.Create)
                    {
                        CreateRequest request = new CreateRequest
                        {
                            Target = entity.Key
                        };
                        executeTransactionRequest.Requests.Add(request);
                    }
                    else if (entity.Value == RequestType.Update)
                    {
                        UpdateRequest request = new UpdateRequest
                        {
                            Target = entity.Key
                        };
                        executeTransactionRequest.Requests.Add(request);
                    }
                    else if (entity.Value == RequestType.Delete)
                    {
                        DeleteRequest request = new DeleteRequest
                        {
                            Target = new EntityReference(entity.Key.LogicalName, entity.Key.Id)
                        };
                        executeTransactionRequest.Requests.Add(request);
                    }
                }

                return((ExecuteTransactionResponse)_service.Execute(executeTransactionRequest));
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
コード例 #23
0
        public void When_execute_is_called_all_requests_are_executed()
        {
            var context = new XrmFakedContext();
            var executor = new ExecuteTransactionExecutor();
            var req = new ExecuteTransactionRequest()
            {
                Requests = new OrganizationRequestCollection()
                {
                    new CreateRequest() { Target = new Entity("contact") },
                    new CreateRequest() { Target = new Entity("contact") },
                    new CreateRequest() { Target = new Entity("contact") }
                }
            };

            var response = executor.Execute(req, context) as ExecuteTransactionResponse;
            var contacts = context.CreateQuery("contact").ToList();
            Assert.Equal(0, response.Responses.Count);
            Assert.Equal(3, contacts.Count);
        }
コード例 #24
0
        public async Task <IActionResult> ExecuteTransaction(ExecuteTransactionRequest request)
        {
            try
            {
                var response = _mediator.Send(request);
                var result   = response.Result;

                if (!result.Success)
                {
                    return(BadRequest(result.Message));
                }

                return(Ok(result));
            }
            catch (ValidationException ex)
            {
                return(BadRequest(ReturnValidations(ex)));
            }
        }
コード例 #25
0
        public List <DtoTransactionResponseGuid> Execute(List <ExecuteTransactionRequest> resultList)
        {
            List <DtoTransactionResponse>     errorResponseList  = new List <DtoTransactionResponse>();
            List <DtoTransactionResponseGuid> responseResultList = new List <DtoTransactionResponseGuid>();

            try
            {
                for (int i = 0; i < resultList.Count; i++)
                {
                    ExecuteTransactionRequest  request        = resultList[i] as ExecuteTransactionRequest;
                    ExecuteTransactionResponse responseResult = (ExecuteTransactionResponse)_orgProxy.Execute(request);

                    foreach (var resultResponse in responseResult.Responses)
                    {
                        if (resultResponse.ResponseName != "Delete")
                        {
                            responseResultList.Add(new DtoTransactionResponseGuid
                            {
                                Id = resultResponse.Results.Select(a => a.Value.ToString()).SingleOrDefault()
                            });
                        }
                    }
                }

                return(responseResultList);
            }
            catch (FaultException <OrganizationServiceFault> ex)
            {
                DtoTransactionResponse dto = new DtoTransactionResponse()
                {
                    ErrorDetails = ex.Detail.ErrorDetails,
                    Message      = ex.Detail.Message,
                    ErrorCode    = ex.Detail.ErrorCode
                };

                throw;
            }
            catch (Exception e)
            {
                throw e;
            }
        }
コード例 #26
0
        private void RunMultipleRequestsInternalBatchTransaction(CTCRunMultipleState state)
        {
            CTCRunMultipleTaskState taskState = new CTCRunMultipleTaskState();

            taskState.Service         = _Service;
            taskState.ReturnResponses = state.ReturnResponses;
            taskState.ContinueOnError = state.ContinueOnError;
            taskState.Requests        = state.Requests.Skip(state.RequestIndex).Take(state.BatchSize);
            state.RequestIndex       += state.BatchSize;
            taskState.Responses       = new List <CTCRunMultipleResponseItem>();

            ExecuteTransactionRequest req = new ExecuteTransactionRequest()
            {
                Requests = new OrganizationRequestCollection()
            };

            req.Requests.AddRange(taskState.Requests);
            try
            {
                var response = _Service.Execute(req) as ExecuteTransactionResponse;
                int reqIndex = 0;
                foreach (var item in response.Responses)
                {
                    CTCRunMultipleResponseItem resultItem = new CTCRunMultipleResponseItem();
                    resultItem.Request = req.Requests[reqIndex];
                    reqIndex++;
                    resultItem.Response = item;
                    taskState.Responses.Add(resultItem);
                }
            }

            catch (FaultException <OrganizationServiceFault> fault)
            {
                RunMultipleRequestsHandleFault(state, fault);
            }

            state.Results.ResultItems.AddRange(taskState.Responses);
        }
コード例 #27
0
        public void ExecuteUpdateSteps(ICrmService crmService)
        {
            var requestsQueue = new Queue <OrganizationRequest>(updateStageSteps);

            do
            {
                var requestsChunk = ToOrganizationRequestCollection(DequeueChunk(requestsQueue, 1000));

                if (requestsChunk.Count == 0)
                {
                    break;
                }


                var transactionalRequest = new ExecuteTransactionRequest
                {
                    ReturnResponses = true,
                    Requests        = requestsChunk
                };

                var res = crmService.ExecuteRequest(transactionalRequest);
            } while (true);
        }
コード例 #28
0
        public void Update(Entity entity)
        {
            var transaction = new ExecuteTransactionRequest();

            foreach (var attribute in entity.Attributes.ToList())
            {
                var attributes = _crmCache.GetValueUpdateCache <EntityAttribute>($"EntityDefinitions(LogicalName='{entity.LogicalName}')/Attributes(LogicalName='{attribute.Key}')", "Get", DateTimeOffset.Now.AddDays(1));

                if (attributes.AttributeTypeName.Value == "LookupType" && attribute.Value == null)
                {
                    var diasociateReq = new DisassociateRequest(entity.ToEntityReference(), attribute.Key);
                    transaction.AddRequest(diasociateReq);
                    entity.Attributes.Remove(attribute.Key);
                }
            }

            var updReq = new UpdateRequest();

            updReq.Target = entity;

            transaction.AddRequest(updReq);

            var response = _webProxy.GetTransactionResponse(transaction);
        }
コード例 #29
0
        [STAThread] // Required to support the interactive login experience
        static void Main(string[] args)
        {
            CrmServiceClient service = null;

            try
            {
                service = SampleHelpers.Connect("Connect");
                if (service.IsReady)
                {
                    // Create any entity records that the demonstration code requires
                    SetUpSample(service);
                    #region Demonstrate
                    // Create an ExecuteTransactionRequest object.
                    var requestToCreateRecords = new ExecuteTransactionRequest()
                    {
                        // Create an empty organization request collection.
                        Requests        = new OrganizationRequestCollection(),
                        ReturnResponses = true
                    };

                    // Create several (local, in memory) entities in a collection.
                    EntityCollection input = GetCollectionOfEntitiesToCreate();

                    // Add a CreateRequest for each entity to the request collection.
                    foreach (var entity in input.Entities)
                    {
                        CreateRequest createRequest = new CreateRequest {
                            Target = entity
                        };
                        requestToCreateRecords.Requests.Add(createRequest);
                    }


                    var responseForCreateRecords =
                        (ExecuteTransactionResponse)service.Execute(requestToCreateRecords);

                    int i = 0;
                    // Display the results returned in the responses.
                    foreach (var responseItem in responseForCreateRecords.Responses)
                    {
                        if (responseItem != null)
                        {
                            DisplayResponse(requestToCreateRecords.Requests[i], responseItem);
                        }
                        i++;
                    }


                    Console.WriteLine("Create request failed for the account{0} and the reason being: {1}");


                    var requestForUpdates = new ExecuteTransactionRequest()
                    {
                        Requests = new OrganizationRequestCollection()
                    };

                    // Update the entities that were previously created.
                    EntityCollection update = GetCollectionOfEntitiesToUpdate();

                    foreach (var entity in update.Entities)
                    {
                        UpdateRequest updateRequest = new UpdateRequest {
                            Target = entity
                        };
                        requestForUpdates.Requests.Add(updateRequest);
                    }


                    ExecuteTransactionResponse responseForUpdates =
                        (ExecuteTransactionResponse)service.Execute(requestForUpdates);
                    Console.WriteLine("Entity records are updated.");

                    Console.WriteLine("Update request failed for the account{0} and the reason being: {1}");
                    #endregion Demonstrate

                    #region Clean up
                    CleanUpSample(service);
                    #endregion Clean up
                }


                else
                {
                    const string UNABLE_TO_LOGIN_ERROR = "Unable to Login to Common Data Service";
                    if (service.LastCrmError.Equals(UNABLE_TO_LOGIN_ERROR))
                    {
                        Console.WriteLine("Check the connection string values in cds/App.config.");
                        throw new Exception(service.LastCrmError);
                    }
                    else
                    {
                        throw service.LastCrmException;
                    }
                }
            }
            catch (Exception ex)
            {
                SampleHelpers.HandleException(ex);
            }

            finally
            {
                if (service != null)
                {
                    service.Dispose();
                }

                Console.WriteLine("Press <Enter> to exit.");
                Console.ReadLine();
            }
        }
        /// <summary>
        /// This sample demonstrates how to execute a collection of message requests in a single database transaction,
        /// by using a single web service call and optionally return the results.
        /// </summary>
        /// <seealso cref="https://msdn.microsoft.com/en-us/library/gg328075.aspx#bkmk_transaction"/>
        /// <param name="serverConfig">Contains server connection information.</param>
        /// <param name="promptforDelete">When True, the user will be prompted to delete all
        /// created entities.</param>
        public void Run(ServerConnection.Configuration serverConfig, bool promptforDelete)
        {
            ExecuteTransactionRequest requestToCreateRecords = null;

            try
            {
                // Get a reference to the organization service.
                using (_serviceProxy = new OrganizationServiceProxy(serverConfig.OrganizationUri, serverConfig.HomeRealmUri, serverConfig.Credentials, serverConfig.DeviceCredentials))
                {
                    // Enable early-bound type support to add/update entity records required for this sample.
                    _serviceProxy.EnableProxyTypes();

                    #region Execute Transaction to create records
                    // Create an ExecuteTransactionRequest object.
                    requestToCreateRecords = new ExecuteTransactionRequest()
                    {
                        // Create an empty organization request collection.
                        Requests        = new OrganizationRequestCollection(),
                        ReturnResponses = true
                    };

                    // Create several (local, in memory) entities in a collection.
                    EntityCollection input = GetCollectionOfEntitiesToCreate();

                    // Add a CreateRequest for each entity to the request collection.
                    foreach (var entity in input.Entities)
                    {
                        CreateRequest createRequest = new CreateRequest {
                            Target = entity
                        };
                        requestToCreateRecords.Requests.Add(createRequest);
                    }

                    // Execute all the requests in the request collection using a single web method call.
                    try
                    {
                        var responseForCreateRecords =
                            (ExecuteTransactionResponse)_serviceProxy.Execute(requestToCreateRecords);

                        int i = 0;
                        // Display the results returned in the responses.
                        foreach (var responseItem in responseForCreateRecords.Responses)
                        {
                            if (responseItem != null)
                            {
                                DisplayResponse(requestToCreateRecords.Requests[i], responseItem);
                            }
                            i++;
                        }
                    }
                    catch (FaultException <OrganizationServiceFault> ex)
                    {
                        Console.WriteLine("Create request failed for the account{0} and the reason being: {1}",
                                          ((ExecuteTransactionFault)(ex.Detail)).FaultedRequestIndex + 1, ex.Detail.Message);
                        throw;
                    }

                    #endregion Execute Transaction to create records

                    #region Execute Transaction to update records
                    ExecuteTransactionRequest requestForUpdates = new ExecuteTransactionRequest()
                    {
                        Requests = new OrganizationRequestCollection()
                    };

                    // Update the entities that were previously created.
                    EntityCollection update = GetCollectionOfEntitiesToUpdate();

                    foreach (var entity in update.Entities)
                    {
                        UpdateRequest updateRequest = new UpdateRequest {
                            Target = entity
                        };
                        requestForUpdates.Requests.Add(updateRequest);
                    }

                    try
                    {
                        ExecuteTransactionResponse responseForUpdates =
                            (ExecuteTransactionResponse)_serviceProxy.Execute(requestForUpdates);
                        Console.WriteLine("Entity records are updated.");
                    }
                    catch (FaultException <OrganizationServiceFault> ex)
                    {
                        Console.WriteLine("Update request failed for the account{0} and the reason being: {1}",
                                          ((ExecuteTransactionFault)(ex.Detail)).FaultedRequestIndex + 1, ex.Detail.Message);
                    }
                    #endregion Execute Transaction for update records

                    DeleteRequiredRecords(promptforDelete);
                }
            }
            catch (FaultException <OrganizationServiceFault> fault)
            {
                // Check if the maximum batch size has been exceeded. The maximum batch size is only included in the fault if it
                // the input request collection count exceeds the maximum batch size.
                if (fault.Detail.ErrorDetails.Contains("MaxBatchSize"))
                {
                    int maxBatchSize = Convert.ToInt32(fault.Detail.ErrorDetails["MaxBatchSize"]);
                    if (maxBatchSize < requestToCreateRecords.Requests.Count)
                    {
                        // Here you could reduce the size of your request collection and re-submit the ExecuteTransaction request.
                        // For this sample, that only issues a few requests per batch, we will just print out some info. However,
                        // this code will never be executed because the default max batch size is 1000.
                        Console.WriteLine("The input request collection contains %0 requests, which exceeds the maximum allowed (%1)",
                                          requestToCreateRecords.Requests.Count, maxBatchSize);
                    }
                }
                // Re-throw so Main() can process the fault.
                throw;
            }
        }
コード例 #31
0
        public ExecuteTransactionResponse GetTransactionResponse(ExecuteTransactionRequest request)
        {
            var requestDictionary = new Dictionary <int, string>();

            var batchid          = "batch_" + Guid.NewGuid().ToString();
            var batchContent     = new MultipartContent("mixed", batchid);
            var changesetID      = "changeset_" + Guid.NewGuid().ToString();
            var changeSetContent = new MultipartContent("mixed", changesetID);

            for (int contentId = 1; contentId <= request.Requests.Count; contentId++)
            {
                HttpMessageContent content = new HttpMessageContent(GetRequestMessage((OrganizationRequest)request.Requests[contentId - 1]));
                content.Headers.Remove("Content-Type");
                content.Headers.TryAddWithoutValidation("Content-Type", "application/http");
                content.Headers.TryAddWithoutValidation("Content-Transfer-Encoding", "binary");
                content.Headers.TryAddWithoutValidation("Content-ID", contentId.ToString());
                changeSetContent.Add(content);
                requestDictionary.Add(contentId, ((OrganizationRequest)request.Requests[contentId - 1]).RequestName);
            }

            batchContent.Add(changeSetContent);

            var batchRequest = new HttpRequestMessage(HttpMethod.Post, _endpoint + "$batch")
            {
                Content = batchContent
            };

            var batchstring = batchRequest.Content.ReadAsStringAsync();

            var httpClient = new HttpClient(new HttpClientHandler {
                Credentials = _credential ?? CredentialCache.DefaultNetworkCredentials
            });
            var response = httpClient.SendAsync(batchRequest)?.Result;

            if (response == null)
            {
                throw new Exception("Сервер вернул пустой ответ");
            }

            if (!response.IsSuccessStatusCode)
            {
                var exception = JsonSerializer.Deserialize <CrmException>(response.Content.ReadAsStringAsync().Result);
                throw new CrmException(exception.Error.Message, exception);
            }

            var responseString = response.Content.ReadAsStringAsync();
            MultipartMemoryStreamProvider batchStream = response.Content.ReadAsMultipartAsync().Result;
            var batchStreamContent = batchStream.Contents.FirstOrDefault();

            MultipartMemoryStreamProvider changesetStream = batchStreamContent.ReadAsMultipartAsync().Result;

            var transactionResponse = new ExecuteTransactionResponse();

            foreach (var changesetContent in changesetStream.Contents)
            {
                changesetContent.Headers.Remove("Content-Type");
                changesetContent.Headers.Add("Content-Type", "application/http; msgtype=response");

                var indivdualResponse = changesetContent.ReadAsHttpResponseMessageAsync().Result;

                if (!indivdualResponse.IsSuccessStatusCode)
                {
                    var exception = JsonSerializer.Deserialize <CrmException>(response.Content.ReadAsStringAsync().Result);
                    throw new CrmException(exception.Error.Message, exception);
                }

                var operationName = requestDictionary.FirstOrDefault(dic => dic.Key == int.Parse(changesetContent.Headers.GetValues("Content-ID").FirstOrDefault())).Value;

                if (operationName == Constants.CREATE)
                {
                    var idString = indivdualResponse.Headers.GetValues("OData-EntityId").FirstOrDefault();
                    idString = idString.Replace(_endpoint, "").Replace("(", "").Replace(")", "");
                    idString = idString.Substring(idString.Length - 36);

                    var createResponse = new CreateResponse {
                        Id = Guid.Parse(idString), ResponseName = operationName
                    };
                    transactionResponse.Responses.Add(createResponse);
                }

                if (operationName == Constants.UPDATE)
                {
                    var updateResponse = new UpdateResponse {
                        ResponseName = operationName
                    };
                    transactionResponse.Responses.Add(updateResponse);
                }

                if (operationName == Constants.DELETE)
                {
                    var deleteResponse = new DeleteResponse {
                        ResponseName = operationName
                    };
                    transactionResponse.Responses.Add(deleteResponse);
                }

                if (operationName == Constants.DISASSOCIATE)
                {
                    var deleteResponse = new DissacociateResponse {
                        ResponseName = operationName
                    };
                    transactionResponse.Responses.Add(deleteResponse);
                }

                if (operationName == Constants.ASSOCIATE)
                {
                    var deleteResponse = new AssociateResponse {
                        ResponseName = operationName
                    };
                    transactionResponse.Responses.Add(deleteResponse);
                }
            }

            return(transactionResponse);
        }
コード例 #32
0
 Task <ExecuteTransactionResponse> IAmazonDynamoDB.ExecuteTransactionAsync(ExecuteTransactionRequest request, CancellationToken cancellationToken)
 {
     throw new NotSupportedException();
 }
コード例 #33
0
        public static void method()
        {// Create an ExecuteTransactionRequest object.
            crmService       obj  = new crmService();
            CrmServiceClient conn = obj.CrmConnector();

            _orgService = (IOrganizationService)conn.OrganizationWebProxyClient != null ? (IOrganizationService)conn.OrganizationWebProxyClient : (IOrganizationService)conn.OrganizationServiceProxy;


            var requestToCreateRecords = new ExecuteTransactionRequest()
            {
                // Create an empty organization request collection.
                Requests        = new OrganizationRequestCollection(),
                ReturnResponses = true
            };

            // Create several (local, in memory) entities in a collection.
            Entity o1 = new Entity("salesorder");

            o1.Attributes["name"] = "test1 order";
            Entity opp1 = new Entity("opportunity");

            opp1.Attributes["name"] = "test1 opp";
            EntityCollection collection = new EntityCollection();

            collection.Entities.Add(opp1);
            collection.Entities.Add(o1);


            // Add a CreateRequest for each entity to the request collection.
            foreach (var entity in collection.Entities)
            {
                CreateRequest createRequest = new CreateRequest {
                    Target = entity
                };
                requestToCreateRecords.Requests.Add(createRequest);
            }

            // Execute all the requests in the request collection using a single web method call.
            try
            {
                crmService service = new crmService();
                var        responseForCreateRecords =
                    (ExecuteTransactionResponse)_orgService.Execute(requestToCreateRecords);

                int i = 0;
                // Display the results returned in the responses.
                foreach (var responseItem in responseForCreateRecords.Responses)
                {
                    if (responseItem != null)
                    {
                        Console.WriteLine("Created " + ((EntityReference)requestToCreateRecords.Requests[i].Parameters["Target"]).Name
                                          + " with record id as " + responseItem.Results["id"].ToString());
                    }
                    i++;
                }
            }
            catch (FaultException <OrganizationServiceFault> ex)
            {
                Console.WriteLine("Create request failed for the account{0} and the reason being: {1}",
                                  ((ExecuteTransactionFault)(ex.Detail)).FaultedRequestIndex + 1, ex.Detail.Message);
                throw;
            }
        }