C# HttpClient.PostAsyn c не возвращает и не выдает ошибку - PullRequest
0 голосов
/ 13 июля 2020

У меня есть служба Windows, выполняющая HTTP-запрос POST. Конечная точка REST работает и тестировалась отдельно. После вызова PostAsync отладчик не продолжает работу или выдает ошибку. Каковы возможные проблемы, вызывающие такое поведение? Ниже приведен фрагмент кода, отправляющий запрос POST,

EDIT: Я изменил это на asyn c -await и использовал ConfigureAWait, но это не решило проблему. Мне нужно знать, из-за чего функция не возвращает никакого значения.

HttpClientHandler handler = GetCookieHandler();
using(HttpClient client = new HttpClient(handler)) {
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("basic", accessToken);

    client.DefaultRequestHeaders.Add("UniqueId", _configReader.UniqueId);

    SetRequestCookie(handler);

    string jsonContent = JsonConvert.SerializeObject(content);

    HttpResponseMessage response = client.PostAsync(url, new StringContent(jsonContent, Encoding.UTF8, "application/json")).Result;

    SaveCookie(handler, response.RequestMessage.RequestUri);

    if (response.StatusCode == HttpStatusCode.Unauthorized) {
        var customerJsonString = response.Content.ReadAsStringAsync().Result;

        Error data = JsonConvert.DeserializeObject < Error > (customerJsonString);

        switch (data.ErrorCode) {
        case AccessTokenValidationCodes.ExpiredOrInvalidDateTime:
            logger.Warn("Expired AccessToken");
            break;

        default:
            break;
        }
    }

    if (response.StatusCode == HttpStatusCode.Unauthorized) {
        logger.Error("Request :{0}, AccessToken {1}  response Unauthorized", apirUrl, accessToken);
        return null;
    }
    if (response.StatusCode == HttpStatusCode.InternalServerError) {
        logger.Warn("Request response InternalServerError");
        return null;
    }
    return response;
}

1 Ответ

0 голосов
/ 13 июля 2020

В дополнение к моему повторяющемуся комментарию, вам нужно прочитать ответ до конца. В настоящее время вы делаете это только в случае несанкционированного доступа, но вы должны прочитать до конца в любом случае. Убедитесь, что вы приняли совет из комментария , в том числе совет из asyn c await, а также:

Переместите строку ReadAsString и убедитесь, что она выполняется для всех вызовов конечная точка.

 HttpResponseMessage response = client.PostAsync(url, new StringContent(jsonContent, Encoding.UTF8, "application/json")).Result; 
 var customerJsonString = response.Content.ReadAsStringAsync().Result;

Ваш код

if (response.StatusCode == HttpStatusCode.Unauthorized) {
        var customerJsonString = response.Content.ReadAsStringAsync().Result;

        Error data = JsonConvert.DeserializeObject < Error > (customerJsonString);

        switch (data.ErrorCode) {    
            case AccessTokenValidationCodes.ExpiredOrInvalidDateTime:
                logger.Warn("Expired AccessToken");
                break;

            default:
                break;
        }
...