2017-02-23 69 views
5

我正在尝试在C#中编写AWS Lambda函数。我拥有适用于Visual Studio 2015的AWS工具包。我使用AWS Lambda项目(.Net Core)创建了一个项目,然后选择了空函数选项。这给了我下面的代码:C#中的Amazon Lambda - JsonReaderException

UPDATE & ANSWER 17年2月24日 - 注释标记为答案是有用的知识,但不是我实际的答案。这是@PavelSafronov的评论,在那个答案,做了伎俩。我要么通过什么都没有(并得到错误),或者我认为它要我以JSON格式提供信息,所以我会输入{ "input": "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(); 
    } 

    } 
} 

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

Errors in C:\Test Projects\AWSLambda1\AWSLambda1\AWSLambda1.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日志消息。

在一个侧面说明,我能够得到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": {} 
} 

这使得在Windows机器上的意义,与其说这里亚马逊。我需要一些不同的runtime(s)吗?

该更改没有改变JsonReaderException例外。

我试着加入"Linux": {}但是那也没有改变。

我甚至试图从1.0.0更新NuGet包Microsoft.NETCore.App1.1.0并没有采取任何行动,以及甚至回1.0.1

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

+1

回复:“但是,尽可能我担心,这看起来像一个bug。一个字符串默认为空值...“ - 不带引号的空值是有效的JSON,如果它传递给一个需要字符串的函数,字符串参数将为空。这可以通过使用AWS Lambda控制台并指定'null'作为测试JSON有效负载来验证,而不是* AWS *工具包,因为Toolkit会将未加引号的文本视为字符串(为了方便起见)并在将其传递到Lambda之前引用它。 –

回答

2

我在C#中使用AWS Lambda的经验略有限制,但这是我在输入(如果从控制台触发函数时输入“test”数据)时得到的错误不是实际的JSON格式。最好的办法是为您的测试目的创建一个虚拟输入类,然后给予lambda函数相应的JSON数据以使其正确序列化。

至于您的project.json,我没有必要在之前添加AWS Lambda的运行时部分。如果你这样做,那么你将需要从该列表中选择相应的运行时间: https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog

而且,这里是一个例子project.json文件,如果发现有用: https://gist.github.com/TAGray/8cc812065c3b6abcd732b7f6a3bda92a

希望有所帮助。

+0

在发布成功的结果窗口中,有一个测试函数|配置|事件来源|日志选项 - 我在测试功能上,我没有在示例请求中,也没有在它下面的框中。我点击Invoke并得到''JsonReaderException''消息。我输入了“{”input“:”Something“}的有效JSON并获得相同的消息。 – Grandizer

+0

我创建了一个和我描述的一样的新项目,除了这次我使用了一个“With Tests”。指出“测试功能”选项可能只是一个真正的测试功能(抓住这里的吸管)。在这个新项目中使用非测试功能,同样的错误“JsonReaderException”。我无法使用实际测试功能的完整路径,因为它实际上并不是软件包的一部分。我没有通过命令行执行任何操作(AWS CLI) – Grandizer

+5

问题中的函数需要一个字符串,所以您应该传入带引号的字符串。如果你的函数需要一个复杂的类型,你可以传入JSON对象。 –

2

每帕维尔·萨夫罗诺夫 -

是的,你应该输入字符串不是一个JSON对象,如果您的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对象。如前所述,它与通过Visual Studio通过AWS开发工具包提供的C#Lambdas(接受字符串输入)的默认模板不一致。也许这是一个内置的绊脚石(功能),迫使我们遇到这个问题,拉我们的头发,然后意识到多功能的功能处理程序可以是...