Отладчик останавливается во время синтаксического анализа ответа API-ответа HttpClient, Xamarin Forms - PullRequest
1 голос
/ 22 июня 2019

Я пытаюсь разобрать ответ от ASP.NET Core Web API.Я могу успешно проанализировать ответ JSON в объект C #, но приложение вылетает, не выдавая никакой ошибки, когда проанализированный объект C # возвращается в ViewModel.

в ViewModel

ApiResponse response = await _apiManager.GetAsync<ApiResponse>("authentication/GetUserById/1");

Ответ JSON:

{
"result": {
    "id": 1,
    "userType": 1,
    "firstName": “FirstName”,
    "middleName": null,
    "lastName": “LastName”,        
},
"httpStatusCode": 200,
"httpStatusDescription": "200OkResponse",
"success": true,
"message": "hello"

}

Метод HttpClient GetAsync ():

 public async Task<TResult> GetAsync<TResult>(string endpoint)
    {
        HttpResponseMessage httpResponse = _httpClient.GetAsync(endpoint).GetAwaiter().GetResult();
        httpResponse.EnsureSuccessStatusCode();
        TResult t = default(TResult);
        if (httpResponse.IsSuccessStatusCode)
        {
            string serialized = await httpResponse.Content.ReadAsStringAsync();

            t =  JsonConvert.DeserializeObject<TResult>(serialized);
        }
        return t;
    }

Приложение аварийно завершает работу (отладчик останавливается без ошибок) в операторе «return t».Здесь _httpClient - это одиночный объект HttpClient, использующий DI.

Модель TResult - это объект ApiResponse

public class User
{
    [JsonProperty("id")]
    public int UserId { get; set; }
    [JsonProperty("userType")]
    public int UserType { get; set; }
    [JsonProperty("firstName")]
    public string FirstName { get; set; }
    [JsonProperty("middleName")]
    public string MiddleName { get; set; }
    [JsonProperty("lastName")]
    public string LastName { get; set; }        
}

public abstract class ResponseBase
{
    [JsonProperty("httpStatusCode")]
    public int HttpStatusCode { get; protected set; }
    [JsonProperty("httpStatusDescription")]
    public string HttpStatusDescription { get; protected set; }
    [JsonProperty("success")]
    public bool Success { get; protected set; }
    [JsonProperty("message")]
    public string Message { get; protected set; }
}

public class ApiResponse : ResponseBase
{
    [JsonProperty("result")]
    public User Result { get; set; } = new User();
}

Существуют две проблемы: 1. при выполнении следующего оператора происходит сбой приложения и отладчик останавливаетсябез каких-либо ошибок.

HttpResponseMessage httpResponse = await _httpClient.GetAsync(endpoint).ConfigureAwait(false);

Но когда GetAsync () вызывается с помощью .GetAwaiter (). GetResult (), сетевой вызов выполняется успешно.Я не понимаю, почему ConfigureAwait (false) не удается.

HttpResponseMessage httpResponse = _httpClient.GetAsync(endpoint).GetAwaiter().GetResult();

почему следующий вызов завершается неудачно и происходит сбой приложения?Как я могу вернуть разобранный объект C # в вызывающий код?

return JsonConvert.DeserializeObject (сериализовано);

Пожалуйста, сообщите.

1 Ответ

0 голосов
/ 22 июня 2019

Попробуйте это

try
{
    var result = await httpClient.GetAsync(endpoint);
    var response = await result.Content.ReadAsStringAsync();
    data = JsonConvert.DeserializeObject<TResult>(response);
} 
catch (Exception exp)
{
   Console.Write(exp.InnerMessage);
}

Убедитесь, что вы установили Newtonsoft.Json

...