Exemplo n.º 1
0
        public async Task <CrmRequestMessageHandleResult> ExecuteRequest(CrmRequestMessage request)
        {
            if (!(request is CrmCreateRetrieveRequestMessage))
            {
                var fragment = new TextFragment()
                {
                    Code = TextCodes.CrmRequestMessageTypeNotMatch,
                    DefaultFormatting = "消息请求类型不匹配,期待的类型为{0},实际类型为{1},位置为{2}",
                    ReplaceParameters = new List <object>()
                    {
                        typeof(CrmCreateRetrieveRequestMessage).FullName, request.GetType().FullName, $"{ this.GetType().FullName }.ExecuteRequest"
                    }
                };

                throw new UtilityException((int)Errors.CrmRequestMessageTypeNotMatch, fragment);
            }

            var realRequest = request as CrmCreateRetrieveRequestMessage;

            //获取实体记录的json对象
            var entityJObject = await _crmExecuteEntityConvertJObjectService.Convert(realRequest.Entity);

            var url     = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/{realRequest.Entity.EntityName.ToPlural()}?$select={string.Join(",",realRequest.Attributes)}";
            var headers = new Dictionary <string, IEnumerable <string> >();

            headers["OData-MaxVersion"] = new List <string> {
                "4.0"
            };
            headers["OData-Version"] = new List <string> {
                "4.0"
            };
            headers["Content-Type"] = new List <string> {
                "application/json"
            };
            headers["Content-Type-ChartSet"] = new List <string> {
                "utf-8"
            };
            headers["Accept"] = new List <string> {
                "application/json"
            };
            headers["Prefer"] = new List <string> {
                "return=representation"
            };

            foreach (var itemHeader in realRequest.Headers)
            {
                headers[itemHeader.Key] = itemHeader.Value;
            }

            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url       = url;
            result.Method    = HttpMethod.Post;
            result.Headers   = headers;
            result.Body      = entityJObject.ToString();
            result.Extension = realRequest;


            return(result);
        }
        public async Task <CrmRequestMessageHandleResult> ExecuteRequest(CrmRequestMessage request)
        {
            if (!(request is CrmUpsertRetrieveRequestMessage))
            {
                var fragment = new TextFragment()
                {
                    Code = TextCodes.CrmRequestMessageTypeNotMatch,
                    DefaultFormatting = "消息请求类型不匹配,期待的类型为{0},实际类型为{1},位置为{2}",
                    ReplaceParameters = new List <object>()
                    {
                        typeof(CrmUpsertRetrieveRequestMessage).FullName, request.GetType().FullName, $"{ this.GetType().FullName }.ExecuteRequest"
                    }
                };

                throw new UtilityException((int)Errors.CrmRequestMessageTypeNotMatch, fragment);
            }

            var realRequest = request as CrmUpsertRetrieveRequestMessage;
            //获取实体记录的json对象
            var entityJObject = await _crmExecuteEntityConvertJObjectService.Convert(realRequest.Entity);

            //如果唯一键集合不为空,则使用唯一键作为主键,否则,使用Entity的Id作为主键
            var url = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/{realRequest.Entity.EntityName.ToPlural()}";

            if (realRequest.AlternateKeys != null && realRequest.AlternateKeys.Count > 0)
            {
                StringBuilder strAlternateKey = new StringBuilder();
                foreach (var keyItem in realRequest.AlternateKeys)
                {
                    strAlternateKey.Append(keyItem.Key);
                    strAlternateKey.Append("=");
                    strAlternateKey.Append(await _crmAlternateKeyTypeHandle.Convert(keyItem.Value));
                    strAlternateKey.Append(",");
                }

                if (strAlternateKey.Length > 0)
                {
                    strAlternateKey.Remove(strAlternateKey.Length - 1, 1);
                }

                url = $"{url}({strAlternateKey.ToString()})";
            }
            else
            {
                url = $"{url}({realRequest.Entity.Id.ToString()})";
            }

            url = $"{url}?$select={string.Join(",", realRequest.Attributes)}";
            //var url = $"{realRequest.OrganizationURI}/api/v{realRequest.ApiVersion}/{realRequest.MessageName.ToPlural()}({realRequest.Entity.Id.ToString()})";
            var headers = new Dictionary <string, IEnumerable <string> >();

            headers["OData-MaxVersion"] = new List <string> {
                "4.0"
            };
            headers["OData-Version"] = new List <string> {
                "4.0"
            };
            headers["Content-Type"] = new List <string> {
                "application/json"
            };
            headers["Content-Type-ChartSet"] = new List <string> {
                "utf-8"
            };
            headers["Prefer"] = new List <string> {
                "return=representation"
            };

            foreach (var itemHeader in realRequest.Headers)
            {
                headers[itemHeader.Key] = itemHeader.Value;
            }


            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url       = url;
            result.Method    = HttpMethod.Patch;
            result.Headers   = headers;
            result.Body      = entityJObject.ToString();
            result.Extension = realRequest;

            return(result);
        }