代码之家  ›  专栏  ›  技术社区  ›  Tim Hutchison

从Dynamics CRM插件调用异步库

  •  0
  • Tim Hutchison  · 技术社区  · 7 年前

    我有一个连接到第三方系统API的异步库。我试图在Dynamics C#插件中使用这个库在第三方系统中创建一个新记录。每当插件一次只在一个实体上运行时,我编写的代码就可以很好地工作。但是,如果我同时在两个不同实体上启动插件,我会收到错误:

    我不太确定是什么导致了这个错误,也不知道如何解决它。这似乎与我为连接API而编写的库的异步性质有关。什么会导致此错误?有哪些解决方法?

    插件代码

    APIResponse<COHEN.APIConnector.Model.Entity.ContractJob> response = new APIResponse<COHEN.APIConnector.Model.Entity.ContractJob>();
    
    Task.WaitAll(Task.Run(async () => response = await starConnector.Create(starJob))); 
    

    库代码

    public async Task<APIResponse<T>> Create<T>(T entity) where T : EntityBase
    {
        APIResponse<T> response = new APIResponse<T>();
    
        try
        {
            using (HttpClient client = new HttpClient())
            {
                client.BaseAddress = new Uri(Helpers.GetSystemUrl(Application.Star));
                client.DefaultRequestHeaders.Clear();
                client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/xml"));
    
                response.RequestURL = "Calling ToJSON";
    
                string json = await entity.ToJSON(Application.Star);
    
                response.RequestURL = "JSON: " + json;
    
                response.RequestURL = "RunTask?taskid=" + (int)TaskID.CREATE + "&entity=" +
                    await MapSingleton.Instance.GetFieldName(Application.Star, entity.Type, FieldType.EntityName) +
                    "&json=" + json;
    
                using (HttpResponseMessage responseMessage = await client.GetAsync(
                    "RunTask?taskid=" + (int)TaskID.CREATE + "&entity=" +
                    await MapSingleton.Instance.GetFieldName(Application.Star, entity.Type, FieldType.EntityName) +
                    "&json=" + json
                ))
                {
                    // Check TaskCentre response
                    if (responseMessage.StatusCode == HttpStatusCode.OK)
                    {
                        XmlDocument xmlDocument = new XmlDocument();
                        xmlDocument.LoadXml(await responseMessage.Content.ReadAsStringAsync());
    
                        // Check API Response
                        string responseStatusCode = xmlDocument.GetElementsByTagName("StatusCode").Item(0).InnerText;
                        if (responseStatusCode != "")
                        {
                            StatusCode statusCode = (StatusCode)Convert.ToInt32(responseStatusCode);
                            string statusMessage = xmlDocument.GetElementsByTagName("StatusMessage").Item(0).InnerText;
    
                            if (statusCode == StatusCode.Created)
                            {
                                XmlDocument xmlData = new XmlDocument();
                                xmlData.LoadXml("<data>" + xmlDocument.InnerText.Substring(0, xmlDocument.InnerText.Length - (xmlDocument.InnerText.Length - xmlDocument.InnerText.LastIndexOf("row") - 4)) + "</data>");
                                JObject data = JObject.Parse(JsonConvert.SerializeXmlNode(xmlData));
    
                                await response.SetValues(Application.Star, entity.Type, data["data"]["row"], entity.ID);
                            }
    
                            response.StatusCode = statusCode;
                            response.StatusReason = statusMessage;
                        }
                        else
                        {
                            response.StatusCode = StatusCode.Error;
                            response.StatusReason = "No Status Code Returned - " + response.StatusReason;
                        }
                    }
                    else
                    {
                        response.StatusCode = (StatusCode)responseMessage.StatusCode;
                        response.StatusReason = responseMessage.ReasonPhrase;
                    }
                }
            }
        }
        catch (Exception e)
        {
            response.StatusCode = StatusCode.Error;
            response.StatusReason = e.Message + " : " + e.GetType().ToString() + " : " + e.InnerException + " : " + e.StackTrace;
        }
    
        return response;
    }
    
    1 回复  |  直到 7 年前
        1
  •  0
  •   Tim Hutchison    7 年前

    根据 Dynamics Developer Guide ,则不应在插件中使用全局变量。我使用了一个全局变量来访问导致此问题的第三方库。以下链接文档的相关部分