C# 424尝试与Lex交互时出错

C# 424尝试与Lex交互时出错,c#,amazon-web-services,aws-lambda,C#,Amazon Web Services,Aws Lambda,我遇到了一个AWS问题,它似乎没有那么多文档 我在这里有lambda函数: public async Task<string> FunctionHandler(ConnectRequest request, ILambdaContext context) { AmazonLexClient lexClient = new AmazonLexClient(); var response = new PostTextRes

我遇到了一个AWS问题,它似乎没有那么多文档

我在这里有lambda函数:

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";
        }
我在报纸上读到的可能意味着几件事:

如果Amazon Lex没有足够的权限调用Lambda 功能

如果Lambda函数的执行时间超过30秒

如果函数返回委托对话框操作 不删除任何插槽值

我已经确认我的Lambda确实有权使用PostText和访问Lex。我尝试过将函数的返回类型更改为PostTextResponse,但没有成功,因此我不确定从这里开始该怎么做,没有太多关于这类事情的文档


感谢您的帮助,谢谢

对于任何对此感到好奇的人,我找到了一个答案:

首先,当使用像这样的Lambda函数时,最好返回所需的对象。这就是我最后做的。您还需要以JSON格式设置SessionAttributes

我的代码正在运行,现在如下所示:

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()}");
                }

您是否检查了**其他**两个条件?与DevOps一起检查-对于第一个条件,它拥有执行此操作所需的所有权限。我还有一个音频提示,如果Lambda失败/成功,并且该提示在5-6秒内播放,我会说-对于第二种情况。我不知道您在哪里提到检查Lambda日志以查看函数是否实际被调用,如果是,我倾向于相信函数正在被调用,但假设它没有抛出异常,然后返回Success;不是服务期望从Lambda函数接收的响应。我正在通过CloudWatch检查日志,stacktrace告诉我,它在response=wait lexClient.PostTextAsyncpostRequest上遇到异常;i、 e:给莱克斯的实际职位。因此,代码甚至没有一路迭代以获得返回。CloudWatch确认,lambda函数肯定会被调用。我发布的实际错误是直接来自context.Logger.Log$EXCEPTION捕获的CloudWatch:{Environment.NewLine}{ex.ToJson}{Environment.NewLine}{response.Message}{response.IntentName}{response.slotolescit};
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()}");
                }