Member 14575056 Ответов: 1

API: response.content.readasasync<authenticateduser>() возвращает "null"


Эта строка кода:
await response.Content.ReadAsAsync<AuthenticatedUser>(); 
возвращает "null", когда он должен возвращать <AuthenticatedUser> с именем пользователя и паролем.
Я видел здесь похожую проблему:Response.content.readasasync возвращает null[^однако полученный ответ мне не помог.

Что я уже пробовал:

Вот что у меня есть на данный момент:
public async Task<AuthenticatedUser> Authenticate(string username, string password)
        {
            var data = new FormUrlEncodedContent(new[]
            {
                new KeyValuePair<string, string>("grant_type", "password"),
                new KeyValuePair<string, string>("username", username),
                new KeyValuePair<string, string>("passsword", password)
            });
            using (HttpResponseMessage response = await apiClient.PostAsync("/token", data))
            {
                if (response.IsSuccessStatusCode)
                {
                    var result= await response.Content.ReadAsAsync<AuthenticatedUser>();
                    return result;
                }
                else
                {
                    throw new Exception(response.ReasonPhrase);
                }
            }
        }

Я попробовал заменить
await response.Content.ReadAsAsync<AuthenticatedUser>();

с
await response.Content.ReadAsAsync<object>();
, что в свою очередь потребовало изменения пустоты и интерфейса на
Task<object>
, тоже. Но безрезультатно.
Я тоже попробовал заменить var с AuthenticatedUser и это тоже не сработало. Есть идеи, как обойти эту проблему?

Member 14575056

Я не знаю, важно ли это, но я использую этот метод в другом классе - LoginViewModel, где я применяю параметры имени пользователя и пароля к пустоте Authenticate (). Я убедился, что значения из текстовых полей проанализированы правильно.

Richard MacCutchan

Используйте отладчик, чтобы точно увидеть, что возвращается в ответе.

Member 14575056

Спасибо.Я только что обнаружил, что var "data" в Authenticate() также равен нулю, и я думаю, что именно поэтому "response" тоже равен нулю. Однако "имя пользователя" и "пароль" были отправлены в var "data" правильно. В чем может быть проблема?

Richard MacCutchan

Итак, это должно сказать вам, что что-то не так в процессе аутентификации на сервере. Данные, которые вы отправляете, неверны или в неправильном формате и т. д. Но это не то, с чем мы можем помочь.

Member 14575056

Ладно, спасибо за помощь.

Member 14575056

Похоже, что есть какая-то ошибка с FormUrlEncodedContent, где он неправильно кодирует KeyValuePairs, что приводит к тому, что ответ также становится нулевым. Я слышал, что его можно заменить на StringContent, но я не смог заставить его работать.

Richard MacCutchan

Вы проверили документацию для этого метода и использовали отладчик, чтобы увидеть, что он на самом деле создает?

1 Ответов

Рейтинг:
0

dnxit

Вы можете использовать Json.net для десериализации вашего ответа использование потоков даст вам лучшую производительность, проверьте эту функцию ниже

private static async Task<List<Model>> DeserializeOptimizedFromStreamCallAsync(CancellationToken cancellationToken)
{
    using (var client = new HttpClient())
    using (var request = new HttpRequestMessage(HttpMethod.Get, Url))
    using (var response = await client.SendAsync(request, HttpCompletionOption.ResponseHeadersRead, cancellationToken))
    {
        var stream = await response.Content.ReadAsStreamAsync();

        if (response.IsSuccessStatusCode)
            return DeserializeJsonFromStream<List<Model>>(stream);

        var content = await StreamToStringAsync(stream);
        throw new ApiException
        {
          StatusCode = (int)response.StatusCode,
          Content = content
        };
    }
}


Если вы заинтересованы, пожалуйста, проверьте эту ссылку Эффективные вызовы api с помощью HttpClient и JSON.NET | Джон Тирит[^]