2017-02-23 84 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(接受字符串輸入)的默認模板不一致。也許這是一個內置的絆腳石(功能),迫使我們遇到這個問題,拉我們的頭髮,然後意識到多功能的功能處理程序可以是...