Dialogflow не может разобрать ответ JSON от моего webhook, кажется, изменить кодировку символов - PullRequest
0 голосов
/ 30 мая 2018

У меня есть веб-крюк выполнения, который я пытаюсь использовать для возврата простого ответа на тестовое задание в Dialogflow.

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

Это необработанный ответ, который Dialogflow показывает мне, является ошибкой (прокрутите вправо, чтобы увидеть ошибку в сообщении)

{
  "responseId": "6d2686c1-a87b-4f64-ac4d-f3a5e706763c",
  "queryResult": {
    "queryText": "Test",
    "parameters": {},
    "allRequiredParamsPresent": true,
    "fulfillmentMessages": [
      {
        "text": {
          "text": [
            ""
          ]
        }
      }
    ],
    "intent": {
      "name": "projects/mytestappname-c0f76/agent/intents/3d70ef1d-9723-451f-b79d-b40f4e16d8b0",
      "displayName": "Test"
    },
    "intentDetectionConfidence": 1,
    "diagnosticInfo": {
      "webhook_latency_ms": 600
    },
    "languageCode": "en"
  },
  "webhookStatus": {
    "code": 3,
    "message": "Webhook call failed. Error: Failed to parse webhook JSON response: Expect message object but got: \"笀∀昀漀氀氀漀眀甀瀀䔀瘀攀渀琀䤀渀瀀甀琀∀㨀渀甀氀氀Ⰰ∀昀甀氀昀椀氀氀洀攀渀琀䴀攀猀猀愀最攀猀∀㨀嬀笀∀戀愀猀椀挀䌀愀爀搀∀㨀渀甀氀氀Ⰰ∀挀愀爀搀∀㨀渀甀氀氀Ⰰ∀挀愀爀漀甀猀攀氀匀攀氀攀挀琀∀㨀渀甀氀氀Ⰰ∀椀洀愀最攀∀㨀渀甀氀氀Ⰰ∀氀椀渀欀伀甀琀匀甀最最攀猀琀椀漀渀∀㨀渀甀氀氀Ⰰ∀氀椀猀琀匀攀氀攀挀琀∀㨀渀甀氀氀Ⰰ∀瀀愀礀氀漀愀搀∀㨀渀甀氀氀Ⰰ∀瀀氀愀琀昀漀爀洀∀㨀渀甀氀氀Ⰰ∀焀甀椀挀欀刀攀瀀氀椀攀猀∀㨀渀甀氀氀Ⰰ∀猀椀洀瀀氀攀刀攀猀瀀漀渀猀攀猀∀㨀渀甀氀氀Ⰰ∀猀甀最最攀猀琀椀漀渀猀∀㨀渀甀氀氀Ⰰ∀琀攀砀琀∀㨀笀∀琀攀砀琀∀㨀嬀∀吀栀椀猀 椀猀 愀 昀甀氀昀椀氀氀洀攀渀琀 洀攀猀猀愀最攀∀崀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀崀Ⰰ∀昀甀氀昀椀氀氀洀攀渀琀吀攀砀琀∀㨀∀吀栀椀猀 椀猀 昀甀氀昀椀氀氀洀攀渀琀 琀攀砀琀∀Ⰰ∀漀甀琀瀀甀琀䌀漀渀琀攀砀琀猀∀㨀渀甀氀氀Ⰰ∀瀀愀礀氀漀愀搀∀㨀笀∀最漀漀最氀攀∀㨀笀∀攀砀瀀攀挀琀唀猀攀爀刀攀猀瀀漀渀猀攀∀㨀琀爀甀攀Ⰰ∀爀椀挀栀刀攀猀瀀漀渀猀攀∀㨀笀∀椀琀攀洀猀∀㨀嬀笀∀搀椀猀瀀氀愀礀吀攀砀琀∀㨀渀甀氀氀Ⰰ∀猀猀洀氀∀㨀渀甀氀氀Ⰰ∀琀攀砀琀吀漀匀瀀攀攀挀栀∀㨀∀吀栀椀猀 椀猀 䐀愀瘀攀✀猀 吀攀猀琀椀渀最 吀攀砀琀∀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀崀紀Ⰰ∀昀椀渀愀氀刀攀猀瀀漀渀猀攀∀㨀笀∀椀琀攀洀猀∀㨀嬀笀∀搀椀猀瀀氀愀礀吀攀砀琀∀㨀渀甀氀氀Ⰰ∀猀猀洀氀∀㨀渀甀氀氀Ⰰ∀琀攀砀琀吀漀匀瀀攀攀挀栀∀㨀∀吀栀椀猀 椀猀 䐀愀瘀攀✀猀 䘀椀渀愀氀 吀攀猀琀椀渀最 吀攀砀琀∀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀崀紀紀紀Ⰰ∀猀漀甀爀挀攀∀㨀∀攀砀愀洀瀀氀攀⸀挀漀洀∀Ⰰ∀䔀吀愀最∀㨀渀甀氀氀紀\"."
  }
}

Однако вВ этом же окне показано, каков был мой фактический полный ответ:

{
  "followupEventInput": null,
  "fulfillmentMessages": [
    {
      "basicCard": null,
      "card": null,
      "carouselSelect": null,
      "image": null,
      "linkOutSuggestion": null,
      "listSelect": null,
      "payload": null,
      "platform": null,
      "quickReplies": null,
      "simpleResponses": null,
      "suggestions": null,
      "text": {
        "text": [
          "This is a fulfillment message"
        ],
        "ETag": null
      },
      "ETag": null
    }
  ],
  "fulfillmentText": "This is fulfillment text",
  "outputContexts": null,
  "payload": {
    "google": {
      "expectUserResponse": true,
      "richResponse": {
        "items": [
          {
            "displayText": null,
            "ssml": null,
            "textToSpeech": "This is Dave's Testing Text",
            "ETag": null
          }
        ]
      },
       "finalResponse": {
        "items": [
          {
             "displayText": null,
             "ssml": null,
            "textToSpeech": "This is Dave's Final Testing Text",
            "ETag": null
           }
        ]
      }
    }
  },
  "source": "example.com",
  "ETag": null
}

Это заголовки ответа

"Content-Type": "application / json; charset = utf-8 "," Дата ":" Среда, 30 мая 2018 г. 07:58:36 GMT "," Сервер ":" Kestrel "," Кодировка передачи ":" chunked ",

Я поставилответ через валидатор, и это определенно допустимый JSON.

Проблема не в содержании ответа JSON, я могу исправить это позже, если он неправильный, проблема в том, что он даже не может начать его анализировать.

У кого-нибудь естьесть идеи, почему Dialogflow вообще не может его прочитать?

Ответы [ 2 ]

0 голосов
/ 18 июня 2018

Основная проблема заключается в том, что ASP.NET Core по умолчанию использует transfer-encoding: chunked для ActionResult, и по какой-то причине Dialogflow не поддерживает синтаксический анализ фрагментированной передачи (большинство клиентов должны обрабатывать ее прозрачно).В этом можно убедиться, посмотрев отклик необработанного сервера с помощью сетевого отладчика.

К сожалению, в ASP.NET Core 2, похоже, нет простого способа отключить фрагментированные ответы ( было вЯдро 1 ).

Обходной путь должен использовать тип ответа ContentResult, который, кажется, возвращает только буферизованные ответы, поэтому он не будет использовать фрагментированную передачу.Но очевидно, что вам нужно обработать свою собственную сериализацию JSON, чтобы она выглядела как

    [HttpGet]
    public ContentResult Test()
    {
        var response = new()
        {
            Hello = "World"
        };

        return Content(JsonConvert.SerializeObject(response), "application/json");
    }
0 голосов
/ 08 июня 2018

Я получаю ту же ошибку.DialogFlow не смог проанализировать ответ JSON, отображающий некоторые странные китайские символы.И, как вы сказали, на вкладке «Ответ о выполнении» будет отображаться сообщение, которое я отправляю обратно!

Единственное отличие состоит в том, что я не использую функции Azure.Мой webhook - это .NET Core 2 Web Api, и я возвращал OkObjectResult, который определенно выдавал действительный ответ JSON.

Я не понял, почему, но мне удалось заставить DialogFlow анализировать сообщение, невозвращая объект, но со следующим:

HttpContext.Response.WriteAsync("{ \"fulfillmentText\" : \"This is a message from my webhook !\" }");
...