c# - botbuilder 不等待来自 HTTP 响应的响应(使用 Restsharp)

标签 c# azure async-await botframework restsharp

所以, 显然,我的机器人一切正常,除了它不等待来自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:。我还尝试了 RESTSharp 响应的阻塞非异步版本(如评论所示),但没有任何效果。

最佳答案

我不太清楚这个问题,但据我所知,您可以尝试为 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);
        }

关于c# - botbuilder 不等待来自 HTTP 响应的响应(使用 Restsharp),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50681368/

相关文章:

c# - 任务的延续(由 async/await 构建)在 WPF 应用程序的主线程上运行,但在控制台应用程序的子线程上运行

c# - 创建并显示没有变量引用的表单

azure - Azure kubernetes 上的 PVC 卷安装需要一个多小时

c# - 在 Application Insights 中记录失败请求的请求正文的最佳实践是什么?

azure - OpenID Connect 使用 Office 365 和 spring security 登录

javascript - 返回一个等待的值会返回一个 Promise? (es7 异步/等待)

C# 异步等待 : How do i write an async method for my example shown below?

c# - 使用 C# 从另一个窗体获取值

c# - 旋转 Windows 屏幕键盘

c# - 当 C# 导致异常时防止 C++ 应用程序崩溃