Amazon Lambda in C# - JsonReaderException



我试图在C#中编写AWS lambda函数。我有Visual Studio 2015的AWS工具包。我使用AWS Lambda项目(.NET Core)创建了一个项目,然后选择了"空功能"选项。这给了我以下代码:

更新&答案02/24/17 - 标记为答案的评论是有用的知识,但不是我的实际答案。这是 @pavelsafronov 在该答案中的评论。我要么什么都没传递(并得到错误),要么我以为它希望我以JSON格式提供信息,以便我输入{ "input": "Some string" }并仍然会出现错误。现在我刚刚通过"一些字符串",它起作用了。,就我而言,>这似乎是一个错误。默认情况下,stringnullable,Amazon 编写的代码甚至假设它可以通过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();
    }
  }
}

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

Errors in C:Test ProjectsAWSLambda1AWSLambda1AWSLambda1.xproj
  Unable to resolve 'Amazon.Lambda.Core (>= 1.0.0)' for '.NETCoreApp,Version=v1.0'.

但是,这将毫无失败地构建并发布给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 )"
  ]
}

日志文件显示Constructors日志消息到达那里,但没有实际的KevingsTestFunction日志消息。

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

"runtimes": {
  "win10-x64": {},
  "win81-x64": {},
  "win8-x64": {},
  "win7-x64": {}
}

在Windows机器上有意义,而在亚马逊上并没有那么多。我需要一些不同的runtime(s)

那个变化没有更改JsonReaderException异常。

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

我什至尝试将Nuget软件包Microsoft.NETCore.App1.0.0更新为1.1.0,这也没有任何作用,甚至还没有回到1.0.1

我会想出他们给您的默认示例会工作,但我在那里错了。Amazon.Lambda.Serialization.Json.JsonSerializer属性似乎存在问题。是否可以仅使用NewtonSoft

pavel safronov-

是的,如果您的lambda功能输入点是:

public string KevinsTestFunction(string input, ILambdaContext context) {

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

"{ "input": "Something" }"

您还可以将lambda功能入口点更改为:

public string KevinsTestFunction(JObject input, ILambdaContext context) {

然后您可以输入这样的JSON对象:

{ "input": "Something" }

如果您不期望任何输入,而只是轮询SQS队列或DynamoDB表,则可以将lambda函数的入口点更改为:

public string KevinsTestFunction(ILambdaContext context) {

许多变体可以玩。


现在根据原始问题的更新,默认情况下,AWS Web控制台测试区域将为您设置默认测试数据以发送到您的lambda函数。该默认测试数据是JSON对象。如前所述,它与C#lambdas(接受字符串输入)的默认模板与通过AWS SDK提供可用的视觉工作室。也许这是一个内置的绊脚石(功能),迫使我们遇到这个问题,将头发拉出上面,然后意识到功能处理程序的多功能性可以是...

更新代码:

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

to:

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

不要忘记

using System.Collections;

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

至于您的项目。如果这样做,您将需要从此列表中选择相关的运行时间:https://learn.microsoft.com/en-us/dotnet/articles/core/rid-catalog

也是一个示例project.json文件,如果您觉得很有用:https://gist.github.com/tagray/8cc812065c3b6abcd732b7f6a3bda92a

希望会有所帮助。

相关内容

  • 没有找到相关文章

最新更新