我有一个实现webhook,我试图用它来返回对Dialogflow上的测试意图的简单响应 .
webhook是一个天蓝色的功能,并使用邮差测试它我可以看到JSON响应正确格式化正确的 Headers 等 .
这是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
}
这些是响应中的 Headers
“Content-Type”:“application / json; charset = utf-8”,“Date”:“Wed,30 May 2018 07:58:36 GMT”,“Server”:“Kestrel”,“Transfer-Encoding”: “分块”,
我通过验证器放置了响应,它绝对是有效的JSON .
问题不在于响应JSON的内容,我可以稍后解决,如果它不正确,问题是它甚至无法开始解析它 .
有没有人知道为什么Dialogflow根本无法读取它?
2 回答
我得到了同样的错误 . DialogFlow无法解析JSON响应,显示一些奇怪的中文字符 . 就像你说的那样,履行响应标签会显示我发回的信息!
唯一的区别是我没有使用Azure功能 . 我的webhook是一个.NET Core 2 Web Api,我正在返回一个肯定会产生有效JSON响应的OkObjectResult .
我还没弄清楚为什么但是我设法让DialogFlow通过不返回一个对象来解析消息但是具有以下内容:
根本问题实际上ASP.NET Core默认使用
transfer-encoding: chunked
表示ActionResult
由于某种原因,Dialogflow不支持解析分块传输(大多数客户端应该透明地处理它) . 您可以通过使用网络调试器查看原始服务器响应来验证这一点 .不幸的是,似乎没有一种简单的方法来禁用ASP.NET Core 2中的分块响应(there was in Core 1) .
解决方法是使用
ContentResult
响应类型,它似乎只返回缓冲响应,因此它不会使用分块传输 . 但显然你需要处理自己的JSON序列化,所以看起来应该是这样的