我有一个实现webhook,我试图用它来回复对Dialogflow上的测试意图的简单响应。
webhook是一个天蓝色的功能,并且已经使用邮递员对其进行了测试我可以看到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;字符集= UTF-8&#34 ;, "日期":"周三,2018年5月30日07:58:36 GMT", " Server":" Kestrel", "转移编码":" chunked",
我通过验证器发出了响应,它绝对是有效的JSON。
问题不在于响应JSON的内容,我可以稍后解决,如果它不正确,问题是它甚至无法开始解析它。
有没有人知道为什么Dialogflow根本无法读取它?
答案 0 :(得分:1)
我得到了同样的错误。 DialogFlow无法解析JSON响应,显示一些奇怪的中文字符。就像你说的那样,履行响应标签会显示我发回的信息!
唯一的区别是我没有使用Azure功能。我的webhook是一个.NET Core 2 Web Api,我正在返回一个肯定会产生有效JSON响应的OkObjectResult。
我还没弄明白为什么但是我设法让DialogFlow通过不返回一个对象来解析消息,但是有以下内容:
HttpContext.Response.WriteAsync("{ \"fulfillmentText\" : \"This is a message from my webhook !\" }");
答案 1 :(得分:1)
根本问题实际上ASP.NET Core默认使用transfer-encoding: chunked
用于ActionResult
,并且由于某种原因,Dialogflow不支持解析分块传输(大多数客户端应该透明地处理它)。您可以通过使用网络调试器查看原始服务器响应来验证这一点。
不幸的是,似乎没有一种简单的方法可以在ASP.NET Core 2(there was in Core 1)中禁用分块响应。
解决方法是使用ContentResult
响应类型,它似乎只返回缓冲响应,因此不会使用分块传输。但显然你需要处理自己的JSON序列化,所以它应该看起来像
[HttpGet]
public ContentResult Test()
{
var response = new()
{
Hello = "World"
};
return Content(JsonConvert.SerializeObject(response), "application/json");
}