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