Асинхронные вызовы застряли в HttpClient.SendAsync () - PullRequest
0 голосов
/ 05 декабря 2018

Я использую Microsoft Bot Framework (SDK v3) для создания бота QnA.При вызове API QnAMaker выполнение застревает в HttpCleint.SendAsync.

Я попытался вызвать ConfigureAwait (false) для всех асинхронных вызовов.Я попытался добавить .Результат в конце вызова функции.Кажется, что оба не работают.

[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 внутренних ошибок сервера.

Я думаю, что асинхронный код где-то блокируется, но я не знаю, где.

РЕДАКТИРОВАТЬ: тот же блок кода (для вызова API) работает, если я пытаюсь его вконсольное приложение.

...