C#中的Amazon Lambda - JsonReaderException

Gra*_*zer 9 c# amazon-web-services aws-lambda

我试图在C#中编写AWS Lambda函数.我有AWS Toolkit for Visual Studio 2015.我使用AWS Lambda项目(.Net Core)创建了一个项目,然后选择了Empty Function选项.这给了我以下代码:

更新和答案02/24/17 - 标记为答案的评论是有用的知识,但不是我的实际答案.这是@PavelSafronov在这个问题的答案是没有的伎俩"的评论.我要么一无所知(并得到错误),或者我认为它希望我以JSON格式提供信息,所以我会输入{ "input": "Some string" }并仍然得到错误.现在我刚刚传入"Some string"就可以了. 但是,就我而言,这似乎是一个错误.一个string是默认nullable,代码亚马逊书面即使假设它可能是通过虚拟的input?.ToUpper(),其中?.被检查null.

注意: 我添加了LambdaLogger.Log行,并Constructor看到我得到的地方:

using Amazon.Lambda.Core;
using Amazon.Lambda.Serialization.Json;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(JsonSerializer))]

namespace AWSLambdaTest1 {

  public class Function {

    public Function() {
      LambdaLogger.Log("Within the Constructor");
    }

    public string KevinsTestFunction(string input, ILambdaContext context) {
      LambdaLogger.Log("Within the KTF");
      return input?.ToUpper();
    }

  }
}
Run Code Online (Sandbox Code Playgroud)

输出屏幕和解决方案资源管理器说:

Errors in C:\Test Projects\AWSLambda1\AWSLambda1\AWSLambda1.xproj
  Unable to resolve 'Amazon.Lambda.Core (>= 1.0.0)' for '.NETCoreApp,Version=v1.0'.
Run Code Online (Sandbox Code Playgroud)

但是,这将构建并发布到AWS.我甚至可以调用它返回以下内容 - 这是我的主要问题:

{
  "errorType" : "JsonReaderException",
  "errorMessage" : "Unexpected character encountered while parsing value: {. Path '', line 1, position 1.",
  "stackTrace"   : [
    "at Newtonsoft.Json.JsonTextReader.ReadStringValue(ReadType readType)",
    "at Newtonsoft.Json.JsonTextReader.ReadAsString()",
    "at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.ReadForType(JsonReader reader, JsonContract contract, Boolean hasConverter)",
    "at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)",
    "at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)",
    "at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)",
    "at lambda_method(Closure , Stream , Stream , ContextInfo )"
  ]
}
Run Code Online (Sandbox Code Playgroud)

日志文件显示Constructors日志消息到达但不是实际的KevingsTestFunction日志消息.

在旁注中,我可以Unable to resolve 'Amazon.Lambda.Core (>= 1.0.0)' for '.NETCoreApp,Version=v1.0'通过将以下内容添加到我的project.json文件中来消除错误:

"runtimes": {
  "win10-x64": {},
  "win81-x64": {},
  "win8-x64": {},
  "win7-x64": {}
}
Run Code Online (Sandbox Code Playgroud)

这在Windows机器上是有意义的,而不是在亚马逊上.我需要一些不同的东西runtime(s)吗?

这种变化并没有改变JsonReaderException例外.

我尝试添加,"Linux": {}但也没有改变.

我甚至尝试更新的NuGet包Microsoft.NETCore.App1.0.01.1.0,并且没有采取任何行动,以及甚至回1.0.1.

我想他们给你的默认例子可以工作,但我错了.似乎Amazon.Lambda.Serialization.Json.JsonSerializer属性存在问题.是否可以使用NewtonSoft

Zax*_*xon 10

Per Pavel Safronov -

是的,如果您的Lambda函数入口点是:您应该输入字符串而不是json对象:

public string KevinsTestFunction(string input, ILambdaContext context) {
Run Code Online (Sandbox Code Playgroud)

然后你可以输入的字符串是:

"{ \"input\": \"Something\" }"
Run Code Online (Sandbox Code Playgroud)

您还可以将Lambda函数入口点更改为:

public string KevinsTestFunction(JObject input, ILambdaContext context) {
Run Code Online (Sandbox Code Playgroud)

然后你可以这样输入一个json对象:

{ "input": "Something" }
Run Code Online (Sandbox Code Playgroud)

如果您不期望任何输入并仅轮询SQS队列或DynamoDb表,那么您可以将Lambda函数的入口点更改为:

public string KevinsTestFunction(ILambdaContext context) {
Run Code Online (Sandbox Code Playgroud)

可以使用许多变体.


现在,根据原始问题的更新,默认情况下,AWS Web控制台TEST区域将为您设置默认测试数据以发送到Lambda函数.该默认测试数据是JSON对象.如上所述,它与通过AWS SDK通过Visual Studio提供的C#Lambdas(接受字符串输入)的默认模板不一致.也许这是一个内置的绊脚石(特征),迫使我们遇到这个问题,把头发拉过来,然后意识到函数处理程序的多样性......


Tim*_*ray 3

我在 C# 中使用 AWS Lambda 的经验有点有限,但这是当输入(“测试”数据,如果您从控制台触发该函数)不是实际的 JSON 格式时出现的错误。最好的选择可能是为测试目的创建一个虚拟输入类,然后为 lambda 函数提供等效的 JSON 数据以使其正确序列化。

至于您的project.json,我之前不需要为AWS Lambda添加运行时部分。如果这样做,则需要从此列表中选择相关的运行时: https: //learn.microsoft.com/en-us/dotnet/articles/core/rid-catalog

如果您觉得有用,这里还有一个示例 project.json 文件: https://gist.github.com/TAGray/8cc812065c3b6abcd732b7f6a3bda92a

希望有帮助。

  • 问题中的函数需要一个字符串,因此您应该传入带引号的字符串。如果您的函数需要复杂类型,您将传入 JSON 对象。 (5认同)