(я полагаю, вы знаете, что DialogFlow будет вызывать ваш код, как указано / зарегистрировано в действии на DialogFlow? Таким образом, ваш код может только отвечать.)
Google.Cloud.Dialogflow.v2
Не звоните в Google. Apis .Dialogflow.v2 (с GoogleCloudDialogflowV2WebhookRequest
и GoogleCloudDialogflowV2WebhookResponse
), но используйте Google. Облако .Dialogflow.v2 (с WebhookRequest
и WebhookResponse
) - см. eTag-error .
Использование Google.Cloud.Dialogflow.v2 NuGet Beta , который в настоящее время находится в режиме предварительного просмотра:
[HttpPost]
public dynamic PostWithCloudResponse([FromBody] WebhookRequest dialogflowRequest)
{
var intentName = dialogflowRequest.QueryResult.Intent.DisplayName;
var actualQuestion = dialogflowRequest.QueryResult.QueryText;
var testAnswer = $"Dialogflow Request for intent '{intentName}' and question '{actualQuestion}'";
var dialogflowResponse = new WebhookResponse
{
FulfillmentText = testAnswer,
FulfillmentMessages =
{ new Intent.Types.Message
{ SimpleResponses = new Intent.Types.Message.Types.SimpleResponses
{ SimpleResponses_ =
{ new Intent.Types.Message.Types.SimpleResponse
{
DisplayText = testAnswer,
TextToSpeech = testAnswer,
//Ssml = $"<speak>{testAnswer}</speak>"
}
}
}
}
}
};
var jsonResponse = dialogflowResponse.ToString();
return new ContentResult { Content = jsonResponse, ContentType = "application/json" }; ;
}
Редактировать : Оказывается, что привязка модели может не связывать все свойства из 'ProtoBuf-json' правильно (например, WebhookRequest.outputContexts[N].parameters
), поэтому, вероятно, следует использовать Google.Protobuf.JsonParser
(например, см. эта документация ).
Этот синтаксический анализатор может запутаться в неизвестных полях, поэтому, возможно, кто-то также захочет игнорировать это.Поэтому теперь я использую этот код (однажды я могу сделать универсальный метод более универсальным и, таким образом, полезным, сделав HttpContext.Request.InputStream
параметром):
public ActionResult PostWithCloudResponse()
{
var dialogflowRequest = ParseProtobufRequest<WebhookRequest>();
...
var jsonResponse = dialogflowResponse.ToString();
return new ContentResult { Content = jsonResponse, ContentType = "application/json" }; ;
}
private T ParseProtobufRequest<T>() where T : Google.Protobuf.IMessage, new()
{
// parse ProtoBuf (not 'normal' json) with unknown fields, else it may not bind ProtoBuf correctly
// https://github.com/googleapis/google-cloud-dotnet/issues/2425 "ask the Protobuf code to parse the result"
string requestBody;
using (var reader = new StreamReader(HttpContext.Request.InputStream))
{
requestBody = reader.ReadToEnd();
}
var parser = new Google.Protobuf.JsonParser(JsonParser.Settings.Default.WithIgnoreUnknownFields(true));
var typedRequest = parser.Parse<T>(requestBody);
return typedRequest;
}
Кстати: этот ProtoBuf-json также являетсяпричина использования WebhookResponse.ToString()
, которая в свою очередь использует Google.Protobuf.JsonFormatter.ToDiagnosticString
.
BotBuilder от Microsoft
пакеты Microsoft BotBuilder и шаблон Visual Studio .Я еще не использовал его, но ожидаю примерно тот же код?
Собственный рукописный проприетарный код
Простой пример кода входящего запроса (называемый Google NLU-Response) предоставляетсяМадока Чиода ( Чомадо ) в Гитхуб .Входящий вызов просто анализируется на ее DialogFlowResponseModel :
public static async Task<HttpResponseMessage> Run([...]HttpRequestMessage req, [...]CloudBlockBlob mp3Out, TraceWriter log)
...
var data = await req.Content.ReadAsAsync<Models.DialogFlowResponseModel>();
Gactions
Если вы планируете работать без DialogFlow позже, обратите вниманиечто интерфейс для Gactions значительно отличается от интерфейса с DialogFlow.Json-параметры и возвращаемые значения имеют некоторое перекрытие, но ничто не выигрывает у вас какое-либо время программирования (возможно, теряя некоторое время, начиная с 'over').
Однако, начиная с DialogFlow, вы можете получить некоторый быстрый опыт диалога(например, дизайн вопросов и ответов / прототипирование).А у DialogFlow-API есть пакет NuGet, в котором у интерфейса Gactions нет пакета NuGet , но пока .