424 Ошибка при попытке взаимодействия с Lex - PullRequest
0 голосов
/ 22 января 2019

У меня возникли некоторые трудности с проблемой AWS, которая, кажется, не так хороша в документации.

У меня есть моя лямбда-функция здесь:

public async Task<string> FunctionHandler(ConnectRequest request, ILambdaContext context)
        {
            AmazonLexClient lexClient = new AmazonLexClient();

            var response = new PostTextResponse();

            PostTextRequest postRequest = new PostTextRequest();

            postRequest.BotName = "X";
            postRequest.BotAlias = "X";
            postRequest.UserId = Guid.NewGuid().ToString();
            postRequest.InputText = "What Time Is My Appointment?";



            try
            {
                response = await lexClient.PostTextAsync(postRequest);
                context.Logger.Log(response.IntentName);
                context.Logger.Log(response.DialogState);
            }
            catch (Exception ex)
            {

                context.Logger.Log($"EXCEPTION CAUGHT: {Environment.NewLine} {ex.ToJson()} {Environment.NewLine} {response.Message} {response.IntentName} {response.SlotToElicit}");
                return "Error";
            }

            context.Logger.Log($"Success from lambda {Environment.NewLine}  Message: {response.Message} {Environment.NewLine} " +
                               $"Dialog State:{response.DialogState}");


            return "Success";
        }

Я вызываю это из потока соединения следующим образом: enter image description here

И в ответ я получаю:

"ErrorType": 2,
    "ErrorCode": "DependencyFailedException",
    "RequestId": "",
    "StatusCode": 424,
    "Message": "Invalid Lambda Response: Received error response from Lambda: Unhandled",
    "Data": {},
    "InnerException": {
        "Response": {
            "StatusCode": 424,
            "IsSuccessStatusCode": false,
            "ContentType": "application/json",
            "ContentLength": 85,
            "ResponseBody": {}
        },
        "Message": "Exception of type 'Amazon.Runtime.Internal.HttpErrorResponseException' was thrown."

То, что я прочитал в Документации Amazon PostText может означать пару вещей:

  • Если у Amazon Lex недостаточно прав для вызова лямбды
    функция.

  • Если лямбда-функция выполняется более 30 секунд.

  • Если лямбда-функция выполнения возвращает диалоговое действие Delegate
    без удаления значений слотов.

Я подтвердил, что у моей Lambda есть разрешение на использование PostText и доступ Lex. Я безуспешно пытался изменить тип возвращаемого значения моей функции на PostTextReponse, поэтому я не уверен, куда идти дальше, документации для такого рода вещей не так много.

Любая помощь приветствуется, спасибо!

1 Ответ

0 голосов
/ 01 февраля 2019

Для всех, кому это интересно, я нашел ответ:

Во-первых, при использовании лямбда-функции, подобной этой, было бы неплохо вернуть объект того, что вы хотите.Что я и сделал в итоге.Вам также необходимо установить SessionAttributes в формате JSON .

Мой код работает и теперь выглядит следующим образом:

public async Task<LambdaResponseItem> FunctionHandler(ConnectRequest request, ILambdaContext context)
        {
            var client = new AmazonLexClient();
            var response = new PostContentResponse();
            var lambdaInfo = new Dictionary<string, string>();

            var contentRequest = new PostContentRequest();
            var postContentStream = new MemoryStream();
            var postContentWriter = new StreamWriter(postContentStream);

            try
            {
                var userInput = request.Details?.Parameters?.GetValueOrDefault("UserInput");

                postContentWriter.Write(userInput); // Grab user input (utterance) value from AWS Connect.
                postContentWriter.Flush();
                postContentStream.Position = 0;

                contentRequest.Accept = "text/plain; charset=utf-8";
                contentRequest.BotName = "IntroGreeting";
                contentRequest.BotAlias = EnvironmentVariables.IsProduction ? "Production" : "Development"; 
                contentRequest.ContentType = "text/plain; charset=utf-8";
                contentRequest.UserId = request.Details?.ContactData?.ContactId;
                contentRequest.InputStream = postContentStream;
                contentRequest.SessionAttributes = request.Details?.Parameters?.ToJson(); // * Must be in Json format or request will return error *



                // POST to Lex
                response = await client.PostContentAsync(contentRequest);
                return new LambdaResponseItem(){
                    Content = ""
                     }

            }
            catch (Exception ex)
            {
                context.Logger.Log($"POST Request to Amazon Lex Failed {ex.ToJson()}");
                }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...