botbuilder 不等待来自 HTTP 响应的响应(使用 restsharp)
botbuilder not waiting for response from HTTP response ( using restsharp)
所以,
显然我的机器人一切正常,除了它不等待来自 restsharp 的其余响应,而是直接显示一个空字段,然后 "Done" 在显示空字段之前没有任何延迟。生成响应大约需要 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);
}
}
P.S:.我还尝试了 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);
}
所以, 显然我的机器人一切正常,除了它不等待来自 restsharp 的其余响应,而是直接显示一个空字段,然后 "Done" 在显示空字段之前没有任何延迟。生成响应大约需要 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);
}
}
P.S:.我还尝试了 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);
}