Исключение отмены задачи при асинхронном вызове метода WebService - PullRequest
0 голосов
/ 10 декабря 2018

Я сталкиваюсь с System.Threading.Tasks.TaskCanceledException при вызове веб-сервиса (скажем, «Backend WebService») из другого веб-сервиса (скажем, «MainWebService») асинхронно.

Чтобы создать PDF формы, MainWebServie должен вызвать метод Backend WebService CreatePDF (formId).

Основной WebService имеет API-интерфейс под названием ProcessForms () , который содержит разделенные запятыми FormIdsможет быть передан в качестве параметра, документ которого (PDF) должен быть создан.

Другой веб-сервис, который называется BackgroundWebService.Он содержит метод с именем CreatePDF () , где можно создать отдельный formId для создания PDF.

Поскольку может быть до 20 FormIds, которые можно разделить запятой и передать в качестве параметраДля метода Main Webservice ProcessForms () для создания каждого PDF-файла я хочу асинхронно вызывать backendWebService из Main WebService, чтобы пользователю не приходилось ждать создания всех 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);

        }
    }
...