почему await не ждет, пока httpclient postasyn c не завершится? - PullRequest
0 голосов
/ 19 марта 2020

Я создаю http-клиент для использования некоторых API.

Вот мой клиентский метод, вызывающий конечную точку API.

public async Task<HttpResponseMessage> SendRequestAsync()
        {

            string adaptiveUri = "https://some-api/api/Authentication/AuthenticateThirdPartyUserAsync";

            using (HttpClient httpClient = new HttpClient())
            {
                var json = JsonConvert.SerializeObject(new { userName = "uname", password = "123", applicantCode = "hello" });
                var payload = new StringContent(json, Encoding.UTF8, "application/json");

                HttpResponseMessage responseMessage = null;
                try
                {
                    responseMessage = await httpClient.PostAsync(adaptiveUri, payload);
                }
                catch (Exception ex)
                {
                    if (responseMessage == null)
                    {
                        responseMessage = new HttpResponseMessage();
                    }
                    responseMessage.StatusCode = HttpStatusCode.InternalServerError;
                    responseMessage.ReasonPhrase = string.Format("RestHttpClient.SendRequest failed: {0}", ex);
                }
                return responseMessage;
            }
        }

метод вызова выглядит следующим образом

public async Task<IBaseStatus> Handle(InspectionAddedEvent domainEvent)
{
   var tk = await _iAClient.SendRequestAsync();
   return something;
}

но await не ждет, пока postasyn c не завершится.

, но когда я использую

httpClient.PostAsync(adaptiveUri, payload).GetAwaiter().GetResult()

, он ждет, пока сообщение не будет завершено.

может кто-нибудь иметь идея об этом?

Спасибо.

1 Ответ

1 голос
/ 19 марта 2020

await _iAClient.SendRequestAsync(); определенно ждет PostAsync.

Я думаю, проблема в том, что вы получаете исключение в SendRequestAsync и запутываете результат.

Полностью удалите try/carch block

public async Task<HttpResponseMessage> SendRequestAsync()
{
    string adaptiveUri ="https://someapi/api/Authentication/AuthenticateThirdPartyUserAsync";

    using (HttpClient httpClient = new HttpClient())
    {
        var json = JsonConvert.SerializeObject(new { userName = "uname", password = "123", applicantCode = "hello" });
        var payload = new StringContent(json, Encoding.UTF8, "application/json");
        return await httpClient.PostAsync(adaptiveUri, payload);                
    }
}

И попробуйте поймать его в звонилке:

public async Task<IBaseStatus> Handle(InspectionAddedEvent domainEvent)
{
    try 
    {
        var tk = await _iAClient.SendRequestAsync();
        return something;
    }
    catch(Exception ex)
    {
        //Probably return some IBaseStatus
    }       
}
...