Response.Content.ReadAsStringAsync не читает все данные

У меня есть лазурная функция, которая вызывает Rest API с базовой проверкой подлинности. Ответная форма сервера в порядке, но у меня проблема с получением только частичных данных из ответа - некоторые поля возвращаются как нулевые.

Я использую httpclient, чтобы сделать остальные вызовы API. Вот мой код:

  using (var client = new HttpClient())
        {

            var webUrl = "https://api.livechatinc.com/chats/XXXXXX";

            client.BaseAddress = new Uri(webUrl);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));

            var user = "XXXXXXXXXX";
            var password = "XXXXXXXXX";
            var base64String = Convert.ToBase64String(Encoding.ASCII.GetBytes($"{user}:{password}"));
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", base64String);

            HttpResponseMessage response   = await client.GetAsync(webUrl);
            response.EnsureSuccessStatusCode();

            //Only getting partial information
            string jsonString = await response.Content.ReadAsStringAsync();

            //Deserialise JSON
            Chat responseData = JsonConvert.DeserializeObject<Chat>(jsonString);

        }

Когда я запускаю свой отладчик функций Azure, я могу доказать, что получаю пустые поля для данных URL, которые я ожидаю.

Response.Content.ReadAsStringAsync не читает все данные

Обратите внимание, что поле responseData показывает нулевое значение для ChatStartUrl после дериализации.

Это связано с тем, что поле не возвращается из содержимого ответа.

Я убедился, что это не мой контракт данных и десериализация JSON.net. Мой контракт данных:

 public  class Chat
{
    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("tickets")]
    public Ticket[] Tickets { get; set; }

    [JsonProperty("visitor_name")]
    public string VisitorName { get; set; }

    [JsonProperty("visitor_id")]
    public string VisitorId { get; set; }

    [JsonProperty("visitor_ip")]
    public string VisitorIp { get; set; }

    [JsonProperty("visitor")]
    public Visitor Visitor { get; set; }

    [JsonProperty("agents")]
    public Agent[] Agents { get; set; }

    [JsonProperty("supervisors")]
    public object[] Supervisors { get; set; }

    [JsonProperty("rate")]
    public string Rate { get; set; }

    [JsonProperty("duration")]
    public long Duration { get; set; }

    [JsonProperty("chat_start_url")]
    public Uri ChatStartUrl { get; set; }

    [JsonProperty("referrer")]
    public Uri Referrer { get; set; }

    [JsonProperty("group")]
    public long[] Group { get; set; }

    [JsonProperty("started")]
    public string Started { get; set; }

    [JsonProperty("custom_variables")]
    public object[] CustomVariables { get; set; }

    [JsonProperty("pending")]
    public bool Pending { get; set; }

    [JsonProperty("tags")]
    public object[] Tags { get; set; }

    [JsonProperty("timezone")]
    public string Timezone { get; set; }

    [JsonProperty("greeting")]
    public Greeting Greeting { get; set; }

    [JsonProperty("messages")]
    public Event[] Messages { get; set; }

   /* [JsonProperty("prechat_survey")]
    public PrechatSurvey[] PrechatSurvey { get; set; }*/

    [JsonProperty("events")]
    public Event[] Events { get; set; }

    [JsonProperty("engagement")]
    public string Engagement { get; set; }

    [JsonProperty("started_timestamp")]
    public long StartedTimestamp { get; set; }

    [JsonProperty("ended_timestamp")]
    public long EndedTimestamp { get; set; }

    [JsonProperty("ended")]
    public string Ended { get; set; }
}

public  class Agent
{
    [JsonProperty("display_name")]
    public string DisplayName { get; set; }

    [JsonProperty("email")]
    public string Email { get; set; }

    [JsonProperty("ip")]
    public string Ip { get; set; }
}

public  class Event
{
    [JsonProperty("author_name", NullValueHandling = NullValueHandling.Ignore)]
    public string AuthorName { get; set; }

    [JsonProperty("text")]
    public string Text { get; set; }

    [JsonProperty("message_json", NullValueHandling = NullValueHandling.Ignore)]
    public string MessageJson { get; set; }

    [JsonProperty("date")]
    public string Date { get; set; }

    [JsonProperty("timestamp")]
    public long Timestamp { get; set; }

    [JsonProperty("agent_id", NullValueHandling = NullValueHandling.Ignore)]
    public string AgentId { get; set; }

    [JsonProperty("user_type")]
    public string UserType { get; set; }

    [JsonProperty("type")]
    public string Type { get; set; }

    [JsonProperty("welcome_message", NullValueHandling = NullValueHandling.Ignore)]
    public bool? WelcomeMessage { get; set; }

    [JsonProperty("event_type", NullValueHandling = NullValueHandling.Ignore)]
    public string EventType { get; set; }
}

public  class Greeting
{
    [JsonProperty("id")]
    public long Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }
}


public  class Ticket
{
    [JsonProperty("id")]
    public string Id { get; set; }
}

public  class Visitor
{
    [JsonProperty("id")]
    public string Id { get; set; }

    [JsonProperty("name")]
    public string Name { get; set; }

    [JsonProperty("email")]
    public string Email { get; set; }

    [JsonProperty("ip")]
    public string Ip { get; set; }

    [JsonProperty("city")]
    public string City { get; set; }

    [JsonProperty("region")]
    public string Region { get; set; }

    [JsonProperty("country")]
    public string Country { get; set; }

    [JsonProperty("country_code")]
    public string CountryCode { get; set; }

    [JsonProperty("timezone")]
    public string Timezone { get; set; }

    [JsonProperty("user_agent")]
    public string UserAgent { get; set; }
}

Что интересно, остальные API отлично работают в Postman, и я могу вернуть все данные.

Это то, что я получаю из ответа почтальона

{
"type": "chat",
"id": "PPTE7XI3AQ",
"tickets": [
    {
        "id": "DJWKT"
    }
],
"visitor_name": "Rupinder Kaur",
"visitor_id": "S1552009602.e395581450",
"visitor_ip": "49.183.59.243",
"visitor": {
    "id": "S1552009602.e395581450",
    "name": "Rupinder Kaur",
    "email": "[email protected]",
    "ip": "49.183.59.243",
    "city": "Abbotsford",
    "region": "Victoria",
    "country": "Australia",
    "country_code": "AU",
    "timezone": "Australia/Victoria",
    "user_agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36"
},
"agents": [
    {
        "display_name": "David",
        "email": "[email protected]",
        "ip": "203.30.93.14"
    }
],
"supervisors": [],
"rate": "not_rated",
"duration": 357,
"chat_start_url": "https://wiise.com/au/explore/detailed-accounting/?utm_source=googlewiise&utm_medium=paidsearch&utm_campaign=Wiise&gclid=EAIaIQobChMI3ZrLuqG14QIVBR2PCh0VIAb7EAAYASAAEgKkWPD_BwE",
"referrer": "https://www.google.com/",
"group": [
    0
],
"started": "Thu, 04/04/19 12:25:43 pm",
"custom_variables": [],
"pending": false,
"tags": [],
"timezone": "Australia/Sydney",
"greeting": {
    "id": 7991,
    "name": "Invite after 360 seconds"
},
"messages": [
    {
        "author_name": "David",
        "text": "Hi there :) \n\nThank you for checking out our website, how can I help?",
        "message_json": "",
        "date": "Thu, 04/04/19 12:25:43 pm",
        "timestamp": 1554341143,
        "agent_id": "[email protected]",
        "user_type": "agent",
        "type": "message",
        "welcome_message": true
    },
    {
        "author_name": "Rupinder Kaur",
        "text": "hi there",
        "message_json": "",
        "date": "Thu, 04/04/19 12:25:54 pm",
        "timestamp": 1554341154,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "author_name": "Rupinder Kaur",
        "text": "I would like to trial it",
        "message_json": "",
        "date": "Thu, 04/04/19 12:26:01 pm",
        "timestamp": 1554341161,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "author_name": "Rupinder Kaur",
        "text": "I am mainly looking for cashflow reports",
        "message_json": "",
        "date": "Thu, 04/04/19 12:26:25 pm",
        "timestamp": 1554341185,
        "user_type": "visitor",
        "type": "message"
    }
],
"prechat_survey": [
    {
        "key": "Name:",
        "value": "xxxxxx",
        "id": "2001"
    },
    {
        "key": "E-mail:",
        "value": "xxxxxx",
        "id": "2002"
    }
],
"events": [
    {
        "author_name": "David",
        "text": "Hi there :) \n\nThank you for checking out our website, how can I help?",
        "message_json": "",
        "date": "Thu, 04/04/19 12:25:43 pm",
        "timestamp": 1554341143,
        "agent_id": "[email protected]",
        "user_type": "agent",
        "type": "message",
        "welcome_message": true
    },
    {
       "author_name": "XXXXXX",
        "text": "XXXXXXXXXX",
        "message_json": "",
        "date": "Thu, 04/04/19 12:25:54 pm",
        "timestamp": 1554341154,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "author_name": "XXXXXX",
        "text": "XXXXXXXXXX",
        "message_json": "",
        "date": "Thu, 04/04/19 12:26:01 pm",
        "timestamp": 1554341161,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "author_name": "XXXXXX",
        "text": "XXXXXXXXXX",
        "message_json": "",
        "date": "Thu, 04/04/19 12:26:25 pm",
        "timestamp": 1554341185,
        "user_type": "visitor",
        "type": "message"
    },
    {
        "text": "Rupinder Kaur left the chat.",
        "date": "Thu, 04/04/19 12:31:40 pm",
        "timestamp": 1554341500,
        "type": "event",
        "event_type": "closed",
        "user_type": "visitor"
    }
],
"engagement": "auto_invite",
"started_timestamp": 1554341143,
"ended_timestamp": 1554341500,
"ended": "Thu, 04/04/19 12:31:40 pm"}

Я попытался десериализовать содержимое, возвращенное Postman, и я получаю все данные без нулевых полей.

//This works
var testJSON = System.IO.File.ReadAllText(@"C:\temp\ChatSchema.json");
Chat responseData = JsonConvert.DeserializeObject<Chat>(testJSON);

Поэтому я подозреваю, что функция Content.ReadAsStringAsync работает не так, как ожидалось.

Я пробовал следующее, и у меня все еще была та же проблема:

       var buffer = await response.Content.ReadAsByteArrayAsync();
       var responseString = Encoding.UTF8.GetString(buffer, 0, buffer.Length);

       string content = responseString;
       Chat des = JsonConvert.DeserializeObject<Chat>(content);

Не пробовал это уже и то же самое - становился нулевым

Stanza 09.04.2019 15:42
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
1
1
1 549
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Чтобы прочитать необработанный текст, а затем десериализовать его в класс модели. Мне также пришлось изменить процедуру сериализации, чтобы сохранить ее как «UTF-8».

Вы можете обратиться к коду, как показано ниже:

var stream = response.Content.ReadAsStreamAsync().Result;
StreamReader reader = new StreamReader(stream);
string text = reader.ReadToEnd();

string content = text;
string des = JsonConvert.DeserializeObject<Chat>(content);
Ответ принят как подходящий

Только что решил мою проблему!

Мне пришлось добавить пользовательский заголовок, так как LiveChat требовал этого:

 client.DefaultRequestHeaders.Add("X-API-Version", "2");

Теперь я получаю всю информацию, включая поступающие данные Uri!

Спасибо за все ответы.

Хм. Интересно, почему это сработало в Postman? Вы настроили его для передачи этого заголовка?

Brian Rogers 10.04.2019 06:40

Да, я это сделал. Мне всегда не хватает простых вещей!

Stanza 12.04.2019 08:28

А, тогда это объясняет. Спасибо за публикацию решения проблемы.

Brian Rogers 12.04.2019 08:44

Другие вопросы по теме