Написание веб-перехватчика выполнения для Dialogflow на .NET C #

Я новичок в работе с диалоговым потоком и довольно новичок в .NET. Я уже некоторое время пытаюсь создать свой веб-перехватчик выполнения. У меня есть возможность работать со встроенным редактором node.js, но я хочу создать свой собственный WebhookController в .NET, чтобы мне было проще выполнять вызовы внешнего API / db. Вот что у меня есть на данный момент:

У меня действительно простой пользовательский интерфейс, похожий на приложение Whats-App, где пользователь может ввести текст, который добавляется в окно чата, а затем javascript проверяется для ответа чат-бота:

function userSubmit() {

var userInput = document.getElementById('user-input').value;

$.ajax({
    type: "GET",
    url: "/Home/CheckIntentAsync",
    data: {
        userInput: userInput
    },
    async: true,
    contentType: "application/json",
    success: function (data) {
        var reply = data;
        var botNode = document.createElement("div");
        botNode.classList.add('chat');
        botNode.classList.add('bot-chat');
        botNode.innerHTML = reply; // <--- appends chat window with the reply from Dialogflow
        chatWindow.appendChild(botNode);
        chatWindow.scrollTop = chatWindow.scrollHeight;
        console.log(data);
    },
    error: function () {
        var reply = "I didn't quite catch that, can you rephrase? :/";
        var botNode = document.createElement("div");
        botNode.classList.add('chat');
        botNode.classList.add('bot-chat');
        botNode.innerHTML = reply;
        chatWindow.appendChild(botNode);
    }
});

Вызов ajax проверяет мой класс HomeController, который подключается к Dialogflow:

public class HomeController : Controller
{

    private string sessionID = "XXX"; // my session ID
    private string projectID = "XXX"; // my projectID

    public ActionResult Index()
    {
        SetEnvironmentVariable();
        return View();
    }

   private void SetEnvironmentVariable()
    {
        try
        {
           Environment.SetEnvironmentVariable("GOOGLE_APPLICATION_CREDENTIALS", "MY PATH TO SERVICE ACCOUNT PRIVATE KEY IS HERE");
        }
        catch (ArgumentNullException)
        {
            throw;
        }
        catch (ArgumentException)
        {
            throw;
        }
    }

    [HttpGet]
    public async Task<JsonResult> CheckIntentAsync(string userInput)
    {
        var sessionClient = await SessionsClient.CreateAsync();
        var sessionName = new SessionName(projectID, sessionID);

        QueryInput queryInput = new QueryInput();
        var queryText = new TextInput();
        queryText.Text = userInput;
        queryText.LanguageCode = "en";
        queryInput.Text = queryText;

        // Make the request
        DetectIntentResponse response = await sessionClient.DetectIntentAsync(sessionName, queryInput);

        var reply = response.QueryResult;

        return Json(reply, JsonRequestBehavior.AllowGet);
    }
}

Пока все вышеперечисленное прекрасно работает со встроенным редактором Dialogflow. Теперь я создаю выполнение своего веб-перехватчика в .NET и не могу заставить его работать. Мой класс API выглядит так:

 public class WebhookController : ApiController
    {
        private static readonly JsonParser jsonParser =
            new JsonParser(JsonParser.Settings.Default.WithIgnoreUnknownFields(true));

        [HttpPost]
        public async Task<HttpResponseMessage> Post()
        {
            WebhookRequest request;
            using (var stream = await Request.Content.ReadAsStreamAsync())
            {
                using (var reader = new StreamReader(stream))
                {
                    request = jsonParser.Parse<WebhookRequest>(reader);
                }
            }
// Simply sets the fulfillment text to equal the name of the intent detected by Dialogflow
            WebhookResponse webhookResponse = new WebhookResponse
            {
                FulfillmentText = request.QueryResult.Intent.DisplayName
            };

            HttpResponseMessage httpResponse = new HttpResponseMessage(HttpStatusCode.OK)
            {
                Content = new StringContent(webhookResponse.ToString())
                {
                    Headers = { ContentType = new MediaTypeHeaderValue("text/json") }
                }
            };
            return httpResponse;
        }
}

Когда я запускаю это, я получаю в диагностической информации консоли диалогового потока сообщение DEADLINE_EXCEEDED, однако веб-перехватчик делает так мало, я не понимаю, почему это так?

  "webhookStatus": {
    "code": 4,
    "message": "Webhook call failed. Error: DEADLINE_EXCEEDED."
  }

Я не знаю, должен ли я выполнять какую-то аутентификацию в веб-перехватчике, а также в моем HomeController?

Будем очень признательны за некоторую помощь !!!

Большое спасибо!


person roseboat    schedule 03.02.2020    source источник
comment
Это может пролить немного света? В зависимости от того, что вы делаете, я бы подумал: Ошибка вызова веб-перехватчика   -  person Ingenioushax    schedule 03.02.2020


Ответы (1)


Я получал ту же ошибку, когда включил вызов веб-перехватчика из последующего намерения, которое не было сопоставлено (с обработчиком) во встроенном редакторе выполнения.

person Mark    schedule 01.03.2020