WebService异步调用方法时出现任务取消异常

时间:2018-12-10 07:16:05

标签: asp.net web-services concurrency async-await thread-safety

当我从另一个webService(让我们说“ MainWebService”)异步调用一个Web服务(让我们说“后端WebService”)时,我遇到了 System.Threading.Tasks.TaskCanceledException

要创建表单的PDF,MainWebServie应该调用Backend WebService方法CreatePDF(formId)。

主Web服务具有一个名为 ProcessForms()的api,该API包含一个逗号分隔的formId可以作为应创建文档(PDF)的参数的形式传递。

另一个Web服务,称为BackgroundWebService。它包含一个名为 CreatePDF()的方法,其中可以使用单个formId来创建PDF。

由于最多可以有20个FormId,这些ID可以用逗号分隔并作为主要Web服务方法ProcessForms()的参数传递以创建每个的PDF,因此我想从主要Web服务异步调用backendWebService,以便用户不必等待所有PDF都在前端创建,此过程可以“解雇”的方式进行。

在大多数情况下,它都能正常工作,但是最近我注意到,在周末几乎发生一次 System.Threading.Tasks.TaskCanceledException ,导致某些记录在过程中被终止

如果我在某处执行错误,请纠正我:

    //Method of MainWebService where comma separated formIds can be passed whose PDF should be created
    public string ProcessForms(string suppliedFormIds)
    {
        //Get the Comma separated GUID to process 
        List<string> formIdList = suppliedFormIds.Split(',').Select(Convert.ToString).ToList();


        //Loop through each record and process the record asynchronously (Fire and Forget)
        for (int i = 0; i <= formIdList.Count; i++)
        {
            var queueId = formIdList[i].ToString();
            **this.ProcessFormRecord**(Guid.Parse(queueId));
        }
        return "Success";
    }


    // method that calls the backendWebService Asynchronously to create the PDF
    public **async void** ProcessFormRecord(Guid formId)
    {
        string message = string.Empty;
        HttpResponseMessage httpResponse = null;
        string webserviceUrl = "https://abcd.com/API/MyWebservice.svc";


        using (HttpClient client = new HttpClient())
        {
            client.BaseAddress = new Uri(webserviceUrl);
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            HttpRequestenter code hereMessage request = new HttpRequestMessage(HttpMethod.Post, webserviceUrl + "/CreatePDF");
            string content = "{\"formId\":\"" + formId.ToString() + "\"}";
            request.Content = new StringContent(content, Encoding.UTF8, "application/json");

            httpResponse = **await client.PostAsync**(request.RequestUri, request.Content);

        }
    }

0 个答案:

没有答案