Сделать асинхронный c запрос от WebService - PullRequest
2 голосов
/ 29 мая 2020

Я создаю WebService, который выполняет 2 операции. 1. Сохраните данные в базе данных SQL 2. Вызовите другой метод микросервиса с помощью HTTP-запроса.

Сейчас он работает, но я должен дождаться ответа микросервиса, чтобы вернуть сообщение клиенту. Я хочу это изменить. Я хочу вызвать метод микросервиса, не дожидаясь его ответа, и немедленно отправить сообщение клиенту.

Это метод.

 [HttpPost]
    public async Task<HttpResponseMessage> saveRRAsync(RrDTO u)
    {
        try
        {
            log.Debug(JsonConvert.SerializeObject(u, Formatting.Indented));
        }
        catch (Exception e)
        {

        }
        DateTime dataInvioMicroservice = DateTime.Now;
        try
        {
            if (u.rrData == null || u.rrData.Count <= 0)
            {
                return Request.CreateResponse(HttpStatusCode.InternalServerError, new RMessageHRV(null,
              "Data empty",
              true,
              (short)status_code.Failure, true, null));
            }

            DbData dbData = new DbData();

            //recupero l'id del paziente dal primo elemento nel json
            String patientId = u.rrData[0].patientId;
            int idPatient = Int32.Parse(patientId);
            int id = getMaxIdFromRR(idPatient);
            List<RR> listRr = new List<RR>();
            foreach (RrDTO.RrData data in u.rrData)
            {
                if (data.rr != null && data.rr.Count > 0)
                {

                    foreach (String d in data.rr)
                    {
                        dataInvioMicroservice = data.createdDate;
                        RR ecg = new RR();
                        ecg.Id = id++;
                        ecg.IdPerson = idPatient;
                        ecg.y = Decimal.Parse(d);
                        ecg.timestamp = data.createdDate;
                        listRr.Add(ecg);
                    }
                }
            }
            dbData.RR.AddRange(listRr);
            int savedData = dbData.SaveChanges();

            //CHIAMO IL MICROSERVICE CHE DOVRà ELABORARE IN AUTOMATICO L'HRV
            HttpClient client = new HttpClient();
            client.BaseAddress = new Uri(endPointMicroservice+ "elaboraHRV");
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(
                new MediaTypeWithQualityHeaderValue("application/json"));

            MicroserviceDTO mT = new MicroserviceDTO();
            mT.applyClearF3A = true;
            mT.countryID = "Central European Standard Time";
            mT.timeType = 0;
            mT.patientId = idPatient;
            mT.date = dataInvioMicroservice;

            HttpResponseMessage response = await CallMicroservice(mT, client);
            if (response != null && response.StatusCode == HttpStatusCode.OK)
            {
                log.Debug(response.Content);
                log.Debug("CHIAMATA AL MICROSERVICE CORRETTO");
            }
            else
            {
                {
                    log.Debug("CHIAMATA AL MICROSERVICE FALLITA");
                    log.Debug(response.Content);
                }
            }

            return Request.CreateResponse(HttpStatusCode.OK, new RMessageHRV(null,
               "Data saved",
               true,
               (short)status_code.Success, true, null));
        }
        catch (Exception e)
        {
            log.Error(string.Format("{0} {1}", e.Message, e.StackTrace));
            log.Error(e.InnerException);
            log.Error(e.Source);
            return Request.CreateResponse(HttpStatusCode.InternalServerError, new RMessageHRV(null,
              "Data empty",
              true,
              (short)status_code.Exception, true, null));
        }
    }

    static async Task<HttpResponseMessage> CallMicroservice(MicroserviceDTO microservice, HttpClient client)
    {
        HttpResponseMessage response = await client.PostAsJsonAsync(
            "", microservice);
        response.EnsureSuccessStatusCode();

        // return URI of the created resource.
        return response;
    }

После этого кода:

 HttpResponseMessage response = await CallMicroservice(mT, client);

Я хочу немедленно отправить ответ клиенту, не дожидаясь ответа метода CallMicroservice, это возможно?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...