C# 424尝试与Lex交互时出错
我遇到了一个AWS问题,它似乎没有那么多文档 我在这里有lambda函数: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
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()}");
}