我试图在C#中编写AWS lambda函数。我有Visual Studio 2015的AWS工具包。我使用AWS Lambda项目(.NET Core)创建了一个项目,然后选择了"空功能"选项。这给了我以下代码:
更新&答案02/24/17 - 标记为答案的评论是有用的知识,但不是我的实际答案。这是 @pavelsafronov 在该答案中的评论。我要么什么都没传递(并得到错误),要么我以为它希望我以JSON格式提供信息,以便我输入{ "input": "Some string" }
并仍然会出现错误。现在我刚刚通过"一些字符串",它起作用了。,就我而言,>这似乎是一个错误。默认情况下,string
是nullable
,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.App
从1.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
希望会有所帮助。