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

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

            var realRequest = request as CrmRetrieveEntityMetadataMultipleRequestMessage;

            var url = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/EntityDefinitions";


            if (!string.IsNullOrEmpty(realRequest.QueryExpression))
            {
                url = $"{url}?{realRequest.QueryExpression}";
            }

            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"
            };

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


            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url       = url;
            result.Method    = HttpMethod.Get;
            result.Headers   = headers;
            result.Extension = realRequest;

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

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

            var realRequest = request as CrmFileAttributeDeleteDataRequestMessage;

            var url     = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/{realRequest.EntityName.ToPlural()}({realRequest.EntityId.ToString()})/{realRequest.AttributeName}";
            var headers = new Dictionary <string, IEnumerable <string> >();


            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url       = url;
            result.Method    = HttpMethod.Delete;
            result.Headers   = headers;
            result.Body      = string.Empty;
            result.Extension = realRequest;

            return(await Task.FromResult(result));
        }
コード例 #3
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);
        }
コード例 #4
0
        public async Task <CrmRequestMessageHandleResult> ExecuteRequest(CrmRequestMessage request)
        {
            if (!(request is CrmFileAttributeUploadChunkingRequestMessage))
            {
                var fragment = new TextFragment()
                {
                    Code = TextCodes.CrmRequestMessageTypeNotMatch,
                    DefaultFormatting = "消息请求类型不匹配,期待的类型为{0},实际类型为{1},位置为{2}",
                    ReplaceParameters = new List <object>()
                    {
                        typeof(CrmFileAttributeUploadChunkingRequestMessage).FullName, request.GetType().FullName, $"{ this.GetType().FullName }.ExecuteRequest"
                    }
                };

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



            var realRequest = request as CrmFileAttributeUploadChunkingRequestMessage;
            var uploadUri   = new Uri(new Uri(realRequest.OrganizationURI), realRequest.UploadUrl);

            var headers = new Dictionary <string, IEnumerable <string> >();

            headers["x-ms-file-name"] = new List <string> {
                realRequest.FileName
            };

            var content = new ByteArrayContent(realRequest.Data);

            content.Headers.ContentRange = new ContentRangeHeaderValue(realRequest.Start, realRequest.End, realRequest.Total);
            content.Headers.Add("Content-Type", "application/octet-stream");

            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url                = uploadUri.ToString();
            result.Method             = HttpMethod.Patch;
            result.Headers            = headers;
            result.Body               = string.Empty;
            result.Extension          = realRequest;
            result.ReplaceHttpContent = content;

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

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

            var realRequest = request as CrmDeleteRequestMessage;

            //如果唯一键集合不为空,则使用唯一键作为主键,否则,使用Entity的Id作为主键
            var url = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/{realRequest.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.EntityId.ToString()})";
            }
            //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"
            };

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

            //判断是否需要进行版本检查
            if (!string.IsNullOrEmpty(realRequest.Version))
            {
                headers["If-Match"] = new List <string>()
                {
                    realRequest.Version
                };
            }

            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url     = url;
            result.Method  = HttpMethod.Delete;
            result.Headers = headers;
            result.Body    = string.Empty;

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

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

            var realRequest = request as CrmBoundFunctionRequestMessage;

            //如果唯一键集合不为空,则使用唯一键作为主键,否则,使用Entity的Id作为主键
            var url = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/{realRequest.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.EntityId.ToString()})";
            }

            url = $"{url}/Microsoft.Dynamics.CRM.{ realRequest.FunctionName}";

            if (realRequest.Parameters == null && realRequest.Parameters.Count == 0)
            {
                url = $"{url}()";
            }
            else
            {
                bool   useAlise            = false;
                string parameterExpression = string.Empty;
                string strAlise            = string.Empty;
                foreach (var parameterItem in realRequest.Parameters)
                {
                    if (parameterExpression == string.Empty)
                    {
                        parameterExpression = $"{parameterItem.Name}=";
                    }
                    else
                    {
                        parameterExpression = $"{parameterExpression},{parameterItem.Name}=";
                    }

                    if (!string.IsNullOrEmpty(parameterItem.Alias))
                    {
                        parameterExpression = $"{parameterExpression},{parameterItem.Name}={parameterItem.Alias}";
                        useAlise            = true;
                        if (strAlise == string.Empty)
                        {
                            strAlise = $"{parameterItem.Alias}={await _crmFunctionParameterConvertService.Convert(parameterItem.Value)}";
                        }
                        else
                        {
                            strAlise = $"{strAlise}&{parameterItem.Alias}={await _crmFunctionParameterConvertService.Convert(parameterItem.Value)}";
                        }
                    }
                    else
                    {
                        parameterExpression = $"{parameterExpression},{parameterItem.Name}={await _crmFunctionParameterConvertService.Convert(parameterItem.Value)}";
                    }
                }

                url = $"{url}({parameterExpression})";
                if (useAlise)
                {
                    url = $"{url}?{strAlise}";
                }
            }

            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"
            };

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

            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url     = url;
            result.Method  = HttpMethod.Get;
            result.Headers = headers;


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

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

            var realRequest = request as CrmUnBoundActionRequestMessage;

            var url = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/{realRequest.ActionName}";


            JObject parameterJObject = new JObject();

            foreach (var parameterItem in realRequest.Parameters)
            {
                var itemResult = await _crmActionParameterConvertService.Convert(parameterItem);

                parameterJObject[parameterItem.Name] = itemResult;
            }



            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"
            };

            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    = JsonSerializerHelper.Serializer(parameterJObject);

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

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

            var batchBoundary     = $"batch_{Guid.NewGuid().ToString()}";
            var changeSetBoundary = $"changeset_{Guid.NewGuid().ToString()}";
            var realRequest       = request as CrmBatchRequestMessage;

            RequestHandleMap handleMap = new RequestHandleMap();

            string strBody = string.Empty;

            if (realRequest.ChangeSetMessages != null && realRequest.ChangeSetMessages.Count > 0)
            {
                strBody = $"--{batchBoundary}\n";
                strBody = $"{strBody}Content-Type: multipart/mixed;boundary={changeSetBoundary}\n\n";

                var changeSetIndex = 0;
                foreach (var batchItem in realRequest.ChangeSetMessages)
                {
                    batchItem.ApiVersion      = realRequest.ApiVersion;
                    batchItem.OrganizationURI = realRequest.OrganizationURI;
                    changeSetIndex++;
                    strBody = $"{strBody}--{changeSetBoundary}\n";
                    strBody = $"{strBody}Content-Type: application/http\n";
                    strBody = $"{strBody}Content-Transfer-Encoding:binary\n";
                    strBody = $"{strBody}Content-ID:{changeSetIndex.ToString()}\n\n";


                    var messageHandle = _crmMessageHandleSelector.Choose(batchItem.GetType().FullName);
                    var handleResult  = await messageHandle.ExecuteRequest(batchItem);

                    strBody = $"{strBody}{handleResult.Method.Method} {handleResult.Url} HTTP/1.1\n";
                    foreach (var headerItem in handleResult.Headers)
                    {
                        strBody = $"{strBody}{headerItem.Key}:{string.Join(";", headerItem.Value)}\n";
                    }

                    strBody = $"{strBody}\n";
                    if (handleResult.ReplaceHttpContent != null)
                    {
                        strBody = $"{strBody}{await handleResult.ReplaceHttpContent.ReadAsStringAsync()}\n";
                    }
                    else
                    {
                        if (!string.IsNullOrEmpty(handleResult.Body))
                        {
                            strBody = $"{strBody}{handleResult.Body}\n";
                        }
                    }



                    handleMap.ChangeSetHandles.Add(new RequestHandleMapItem()
                    {
                        Request = batchItem, HandleResult = handleResult
                    });
                }

                strBody = $"{strBody}\n--{changeSetBoundary}--\n\n";
            }

            if (realRequest.BatchMessages != null && realRequest.BatchMessages.Count > 0)
            {
                foreach (var batchItem in realRequest.BatchMessages)
                {
                    batchItem.ApiVersion      = realRequest.ApiVersion;
                    batchItem.OrganizationURI = realRequest.OrganizationURI;

                    strBody = $"{strBody}--{batchBoundary}--\n";
                    strBody = $"{strBody}Content-Type: application/http\n";
                    strBody = $"{strBody}Content-Transfer-Encoding:binary\n\n";

                    var messageHandle = _crmMessageHandleSelector.Choose(batchItem.GetType().FullName);
                    var handleResult  = await messageHandle.ExecuteRequest(batchItem);

                    strBody = $"{strBody}{handleResult.Method.Method} {handleResult.Url} HTTP/1.1\n";
                    foreach (var headerItem in handleResult.Headers)
                    {
                        strBody = $"{strBody}{headerItem.Key}:{string.Join(";", headerItem.Value)}\n";
                    }
                    strBody = $"{strBody}\n";

                    handleMap.ChangeSetHandles.Add(new RequestHandleMapItem()
                    {
                        Request = batchItem, HandleResult = handleResult
                    });
                }
            }

            if ((realRequest.BatchMessages != null && realRequest.BatchMessages.Count > 0) || (realRequest.ChangeSetMessages != null && realRequest.ChangeSetMessages.Count > 0))
            {
                strBody = $"{strBody}--{batchBoundary}--";
            }


            var url     = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/$batch";
            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> {
                "multipart/mixed"
            };
            headers["Content-Type-boundary"] = new List <string> {
                batchBoundary
            };

            headers["Accept"] = new List <string> {
                "application/json"
            };

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

            handleMap.BatchRequest = realRequest;
            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url       = url;
            result.Method    = HttpMethod.Post;
            result.Headers   = headers;
            result.Body      = strBody;
            result.Extension = handleMap;

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

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

            var realRequest = request as CrmRetrieveMultipleFetchRequestMessage;


            var url = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/{realRequest.EntityName.ToPlural()}?fetchXml={WebUtility.UrlEncode(realRequest.FetchXml.ToString())}";

            if (!string.IsNullOrEmpty(realRequest.AdditionalQueryExpression))
            {
                url = $"{url}&{realRequest.AdditionalQueryExpression}";
            }
            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"
            };



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

            if (realRequest.NeedPagingCookie)
            {
                if (headers.ContainsKey("odata.include-annotations"))
                {
                    headers["odata.include-annotations"] = new List <string> {
                        "Microsoft.Dynamics.CRM.fetchxmlpagingcookie"
                    };
                }
                else
                {
                    var annotations = headers["odata.include-annotations"].ToList();
                    annotations.Add("Microsoft.Dynamics.CRM.fetchxmlpagingcookie");
                    headers["odata.include-annotations"] = annotations;
                }
            }


            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url       = url;
            result.Method    = HttpMethod.Get;
            result.Headers   = headers;
            result.Extension = realRequest;

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

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

            var realRequest = request as CrmUnBoundFunctionRequestMessage;

            var url = $"{realRequest.OrganizationURI}/api/data/v{realRequest.ApiVersion}/{realRequest.FunctionName}";

            if (realRequest.Parameters == null && realRequest.Parameters.Count == 0)
            {
                url = $"{url}()";
            }
            else
            {
                bool   useAlise            = false;
                string parameterExpression = string.Empty;
                string strAlise            = string.Empty;
                foreach (var parameterItem in realRequest.Parameters)
                {
                    if (parameterExpression == string.Empty)
                    {
                        parameterExpression = $"{parameterItem.Name}=";
                    }
                    else
                    {
                        parameterExpression = $"{parameterExpression},{parameterItem.Name}=";
                    }

                    if (!string.IsNullOrEmpty(parameterItem.Alias))
                    {
                        parameterExpression = $"{parameterExpression},{parameterItem.Name}={parameterItem.Alias}";
                        useAlise            = true;
                        if (strAlise == string.Empty)
                        {
                            strAlise = $"{parameterItem.Alias}={await _crmFunctionParameterConvertService.Convert(parameterItem.Value)}";
                        }
                        else
                        {
                            strAlise = $"{strAlise}&{parameterItem.Alias}={await _crmFunctionParameterConvertService.Convert(parameterItem.Value)}";
                        }
                    }
                    else
                    {
                        parameterExpression = $"{parameterExpression},{parameterItem.Name}={await _crmFunctionParameterConvertService.Convert(parameterItem.Value)}";
                    }
                }

                url = $"{url}({parameterExpression})";
                if (useAlise)
                {
                    url = $"{url}?{strAlise}";
                }
            }

            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"
            };

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

            CrmRequestMessageHandleResult result = new CrmRequestMessageHandleResult();

            result.Url     = url;
            result.Method  = HttpMethod.Get;
            result.Headers = headers;

            return(result);
        }