Botbuilder не ожидает ответа от HTTP-ответа (используя restsharp) - PullRequest
0 голосов
/ 04 июня 2018

Итак, по-видимому, все работает нормально в моем боте, за исключением того, что он не ждет ответа покоя от restsharp, а вместо этого напрямую отображает пустое поле, а затем "Готово" без какой-либо задержки перед отображением пустого поля.генерация ответа занимает около 15 секунд, но бот даже не ждет 2 секунды.Нет ошибок, и API работает нормально.

Вот код:

private async Task OnQuerySelected(IDialogContext context, IAwaitable<string> result){
        try
            {

                string optionSelected = await result;
                string[] tokens = optionSelected.Split(',');

                 var rclient = new RestClient("https://demoappservice.azurewebsites.net/");
                var request = new RestRequest("demoAPI", Method.POST);
                request.AddParameter(
                    "application/json",
                    "{ \"name\": \""+tokens[0]+"\", \"address\": \""+tokens[1]+"\"}", // <- your JSON string
                    ParameterType.RequestBody);
                //request.AddParameter("identifier",this.id);
                //request.AddParameter(this.question.keyword, optionSelected);
                //IRestResponse rresponse = await rclient.Execute(request);
                Task<IRestResponse> t= rclient.ExecuteTaskAsync(request);
                t.Wait();
                 var restResponse = await t;
                //await context.PostAsync("request: "+tokens[0]+tokens[1]);
                string content = restResponse.Content; 
                 await context.PostAsync(content);
 await context.PostAsync("Done!");
            }

            catch (TooManyAttemptsException ex)
            {
                await context.PostAsync($"Ooops! Too many attempts :(. But don't worry, I'm handling that exception and you can try again!");

               context.Wait(this.MessageReceivedAsync);
            }
             catch (Exception exg)
             {
                  await context.PostAsync(exg.ToString());
                  context.Wait(this.MessageReceivedAsync);
            }


     }

PS :.Я также пробовал блокировать не отвечающую ASync версию ответа RESTSharp (как видно из комментариев), ничего не получалось.

1 Ответ

0 голосов
/ 04 июня 2018

Я не очень хорошо понимаю этот вопрос, но из всего, что я понимаю, вы можете попробовать создать отдельный асинхронный метод для вызова API, как это

private async static Task<IRestResponse> NewMethod(string[] tokens)
        {
            var rclient = new RestClient("https://demoappservice.azurewebsites.net/");
            var request = new RestRequest("demoAPI", Method.POST);
            request.AddParameter(
                "application/json",
                "{ \"name\": \"" + tokens[0] + "\", \"address\": \"" + tokens[1] + "\"}", // <- your JSON string
                ParameterType.RequestBody);
            //request.AddParameter("identifier",this.id);
            //request.AddParameter(this.question.keyword, optionSelected);
            //IRestResponse rresponse = await rclient.Execute(request);
            return await rclient.ExecuteTaskAsync(request);
        }
...