异步调用卡在HttpClient.SendAsync()

时间:2018-12-05 19:33:38

标签: c# asp.net-mvc azure botframework bots

我正在使用Microsoft Bot框架(SDK v3)创建QnA机器人。调用QnAMaker API时,执行卡在HttpCleint.SendAsync。

我尝试在所有异步调用上调用ConfigureAwait(false)。 我尝试在函数调用结束时添加.Result。 两者似乎都不起作用。

[Serializable]
public class QnAMakerService
{
    private string qnaServiceHostName;
    private string knowledgeBaseId;
    private string endpointKey;

    public QnAMakerService()
    {
        qnaServiceHostName = "foo";
        knowledgeBaseId = "bar";
        endpointKey = "foo";

    }
    async Task<string> Post(string uri, string body)
    {
        using (var client = new HttpClient())
        using (var request = new HttpRequestMessage())
        {
            request.Method = HttpMethod.Post;
            request.RequestUri = new Uri(uri);
            request.Content = new StringContent(body, Encoding.UTF8, "application/json");
            request.Headers.Add("Authorization", "EndpointKey " + endpointKey);

            var response = await client.SendAsync(request);
            return await response.Content.ReadAsStringAsync();
        }
    }
    public async Task<string> GetAnswer(string question)
    {
        string uri = qnaServiceHostName + "/qnamaker/knowledgebases/" + knowledgeBaseId + "/generateAnswer";
        string questionJSON = @"{'question': '" + question + "'}";

        var response = await Post(uri, questionJSON);

        var answers = JsonConvert.DeserializeObject<QnAAnswer>(response);
        if (answers.answers.Count > 0)
        {
            return answers.answers[0].answer;
        }
        else
        {
            return "No good match found.";
        }
    }
}


[BotAuthentication]
public class MessagesController : ApiController
{
    /// <summary>
    /// POST: api/Messages
    /// Receive a message from a user and reply to it
    /// </summary>
    /// 

    QnAMakerService qna = new QnAMakerService();


    public async Task<HttpResponseMessage> Post([FromBody]Activity activity)
    {
        if (activity.Type == ActivityTypes.Message)
        {

            ConnectorClient connector = new ConnectorClient(new Uri(activity.ServiceUrl));

            var q = await qna.GetAnswer(activity.Text);

            // return our reply to the user
            Activity reply = activity.CreateReply($"{q}");
            connector.Conversations.ReplyToActivity(reply);
        }
        else
        {
            HandleSystemMessage(activity);
        }
        var response = Request.CreateResponse(HttpStatusCode.OK);
        return response;
    }

}

SendAsync调用后,内部服务器错误消息为500,执行停止。

我认为异步代码正在某处被阻塞,但是我不知道在哪里。

EDIT:如果我在控制台应用程序中尝试,则相同的代码块(用于调用API)可以工作。

0 个答案:

没有答案