Я знаю, что это должен быть комментарий (поскольку на самом деле это не ответ), но он довольно подробный, и я не хотел, чтобы он терялся в шуме.
У меня такая же проблема с использованием WebAPI на локальном компьютере (с использованием ngrok для туннелирования обратно в Kestrel). У моего друга есть рабочий код (он размещается в AWS, а не в Azure), поэтому я начал изучать различия между нашими ответами. Я заметил следующее:
- Это происходит с функциями Azure и WebAPI (так что это не так)
- Полезные данные JSON идентичны (так что это не так)
- Рабочая нагрузка не разбита
- Рабочая полезная нагрузка не имеет типа содержимого
В качестве эксперимента я добавил этот код в Startup.cs
в методе Configure
:
app.Use(async (context, next) =>
{
var original = context.Response.Body;
var memory = new MemoryStream();
context.Response.Body = memory;
await next();
memory.Seek(0, SeekOrigin.Begin);
if (!context.Response.Headers.ContentLength.HasValue)
{
context.Response.Headers.ContentLength = memory.Length;
context.Response.ContentType = null;
}
await memory.CopyToAsync(original);
});
Этот код отключает фрагменты ответа, что теперь вызывает новую и немного более интересную для меня ошибку в консоли Google:
* Сбой вызова веб-перехватчика. Ошибка: не удалось проанализировать ответ JSON веб-перехватчика: com.google.gson.stream.MalformedJsonException: незавершенный объект в строке 1, столбец 94, путь $. \ U0000 \\ "\ u0000f \ u0000u \ u0000l \ u0000f \ u0000i \ u0000l \ u0000l \ u0000m \ u0000e \ u0000n \ u0000t \ u0000M \ u0000e \ u0000s \ u0000s \ u0000a \ u0000g \ u0000e \ u0000s \ u0000 \\ "\ u0000. \
Сначала я подумал, что это может быть кодирование, поэтому я спрятал свой JSON в виде строки и использовал различные классы Encoding
для преобразования между ними, но безрезультатно.
Я запустил Postman и вызвал свою конечную точку (используя ту же полезную нагрузку, что и Google), и я могу правильно видеть всю полезную нагрузку ответа - это почти как если бы конец Google завершал поток на полпути через чтение ...
Надеюсь, эта дополнительная информация поможет нам разобраться в происходящем!
Обновлять
После еще нескольких поисков и различных конфигураций сервера / лямбда я заметил этот пост здесь: https://github.com/googleapis/google-cloud-dotnet/issues/2258
Оказывается, виноват json.net! Я предполагаю, что это как-то связано с форматировщиками, выходящими из конвейера. Чтобы доказать это, я добавил этот жестко запрограммированный ответ на свой POST-контроллер, и он сработал! :)
return new ContentResult()
{
Content = "{\"fulfillmentText\": null,\"fulfillmentMessages\": [],\"source\": null,\"payload\": {\"google\": {\"expectUserResponse\": false,\"userStorage\": null,\"richResponse\": {\"items\": [{\"simpleResponse\": {\"textToSpeech\": \"Why hello there\",\"ssml\": null,\"displayText\": \"Why hello there\"}}],\"suggestions\": null,\"linkOutSuggestion\": null}}}}",
ContentType = "application/json",
StatusCode = 200
};
person
gplumb
schedule
31.12.2018