2017-02-23 5 views
5

Ich versuche, eine AWS Lambda-Funktion in C# zu schreiben. Ich habe das AWS Toolkit für Visual Studio 2015. Ich habe ein Projekt mit dem AWS Lambda-Projekt (.Net Core) erstellt und dann die Option Leere Funktion ausgewählt. Welche gab mir den folgenden Code:Amazon Lambda in C# - JsonReaderException

UPDATE & ANTWORT 02/24/17 - Der Kommentar markierte als die Antwort nützliches Wissen war, aber nicht die eigentliche Antwort für mich. Es war @PavelSafronov 's Kommentar in dieser Antwort, die den Trick gemacht hat. Ich gab entweder nichts ein (und bekam den Fehler) oder ich nahm an, dass es wollte, dass ich die Informationen im JSON-Format gebe, also würde ich { "input": "Some string" } eingeben und immer noch den Fehler bekommen. Jetzt, wo ich "Some string" übergeben habe, hat es funktioniert. Allerdings, so weit es mich betrifft, scheint dies wie ein Fehler. A string ist standardmäßig nullable und der Code geschrieben von Amazon geht sogar davon aus, dass es virtuell von der input?.ToUpper() sein könnte, wo die ?. auf null prüft.

Hinweis:Ich habe die LambdaLogger.Log Linien und die Constructor zu sehen, wo ich war immer:

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(); 
    } 

    } 
} 

Der Ausgabebildschirm und Lösung Explorer sagte:

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

jedoch Dies erstellt und veröffentlicht in AWS ohne Fehler. Ich kann es auch aufrufen, die gibt die folgende - Und ist meine Hauptfrage:

{ 
    "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)" 
    ] 
} 

Die Log-Datei zeigte, dass die Constructors Lognachricht bekam es aber nicht die tatsächliche KevingsTestFunction Protokollmeldung.

Auf einer Seite zur Kenntnis, ich bin in der Lage, die Unable to resolve 'Amazon.Lambda.Core (>= 1.0.0)' for '.NETCoreApp,Version=v1.0' Fehler zu erhalten, indem Sie folgende meine project.json Datei zu gehen weg:

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

Welchen Sinn auf einem Windows-Rechner auf Amazon, nicht so viel hier macht . Brauche ich etwas anderes runtime(s)?

Diese Änderung hat die JsonReaderException Ausnahme nicht geändert.

Ich habe versucht, "Linux": {} hinzuzufügen, aber das machte auch keine Änderung.

Ich versuchte sogar, als auch das NuGet Paket Microsoft.NETCore.App1.0.0-1.1.0 und das tat nichts zu aktualisieren und sogar zu 1.0.1 zurück.

Ich würde das Standardbeispiel, das sie geben, würden Sie arbeiten, aber ich bin da falsch. Offenbar gibt es Probleme mit dem Attribut Amazon.Lambda.Serialization.Json.JsonSerializer. Ist es möglich, einfach NewtonSoft zu verwenden?

+1

Re: "Allerdings so weit Ich bin besorgt, dies scheint wie ein Fehler. Eine Zeichenfolge ist standardmäßig Nullable ... "- Unquoted" null "ist gültig JSON, und wenn das in einer Funktion, die eine Zeichenfolge erwartet übergeben wird, wird der Parameter string null sein. Dies kann durch Verwendung der AWS Lambda Console und Angabe von 'null' als Test-JSON-Payload, aber * nicht * des AWS VS-Toolkits verifiziert werden, da das Toolkit nicht aufgeführten Text als String behandelt und vor dem Übergeben an Lambda anführt . –

Antwort

2

Meine Erfahrung mit AWS Lambda in C# in ein wenig begrenzt, aber das ist die Art von Fehler, die ich bekomme, wenn die Eingabe ("Test" Daten, wenn Sie die Funktion von der Konsole auslösen) ist nicht in einem tatsächlichen JSON-Format .Die beste Wette wäre, eine Dummy-Eingabeklasse für Ihre Testzwecke zu erstellen und dann der Lambda-Funktion die entsprechenden JSON-Daten zu geben, damit sie richtig serialisiert wird.

Wie für Ihre project.json, musste ich nicht zuvor den Abschnitt Laufzeiten für AWS Lambda hinzufügen. Wenn Sie das tun, dann müssen Sie die entsprechenden Laufzeiten aus dieser Liste auswählen: https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog

Auch hier ist ein Beispiel project.json Datei, wenn Sie feststellen, dass nützlich: https://gist.github.com/TAGray/8cc812065c3b6abcd732b7f6a3bda92a

Hoffnung, das hilft.

+0

Während sich die Veröffentlichung im Ergebnisfenster befindet, gibt es eine Testfunktion | Konfiguration | Ereignisquellen | Logs Option - Ich bin auf der Test-Funktion, wo ich nichts in die Beispiel-Anfrage noch in das Feld darunter legen. Ich klicke auf Aufrufen und erhalte die '' JsonReaderException'' Nachricht. Ich gebe gültiges JSON von '' {"input": "Something"} '' ein und bekomme die gleiche Nachricht. – Grandizer

+0

Ich habe ein neues Projekt erstellt, das gleiche wie ich beschrieben habe, außer dass ich dieses Mal "With Tests" verwendet habe. Wenn man bedenkt, dass die "Test Function" -Option nur eine echte Test-Funktion sein kann (Greifen an Strohhalmen hier). Unter Verwendung der Nicht-Test-Funktion in diesem neuen Projekt derselbe Fehler "JsonReaderException". Ich bin nicht in der Lage, die vollständige Pfadangabe zur eigentlichen Testfunktion zu verwenden, da sie nicht Teil des Pakets ist. Ich mache nichts davon über die Befehlszeile (AWS CLI) – Grandizer

+5

Die Funktion in der Frage erwartet eine Zeichenfolge, also sollten Sie eine Zeichenfolge in Anführungszeichen übergeben.Sie würden JSON-Objekte übergeben, wenn Ihre Funktion einen komplexen Typ erwartet. –

2

Per Pavel Safronov -

Ja, Sie sollten eine Zeichenfolge nicht ein JSON-Objekt, wenn Ihr Lambda-Funktion Eintrittspunkt eintreten:

public string KevinsTestFunction(string input, ILambdaContext context) { 

Dann wird die Zeichenfolge, die Sie eingeben könnte, ist:

"{ \"input\": \"Something\" }" 

Sie können den Einstiegspunkt für Lambda-Funktionen auch ändern in:

public string KevinsTestFunction(JObject input, ILambdaContext context) { 

Dann können Sie ein JSON-Objekt wie so ein:

{ "input": "Something" } 

Wenn Sie keine Eingaben und lediglich Polling einer SQS-Warteschlange oder DynamoDB Tabelle dann könnte man die Eintrittspunkt der Lambda-Funktion ändern erwartet zu:

public string KevinsTestFunction(ILambdaContext context) { 

Viele Variationen zum Spielen.


Jetzt pro dem Update in der ursprünglichen Frage, standardmäßig wird der AWS Webkonsole TEST Bereich, den Sie mit den Standardtestdaten einrichten, um Ihre Lambda-Funktion zu senden. Diese Standardtestdaten sind ein JSON-Objekt. Wie bereits erwähnt, steht es im Widerspruch zu den Standardvorlagen für die C# Lambdas (die die Zeichenfolgeneingabe akzeptieren), die über Visual Studio über das AWS SDK zur Verfügung gestellt werden. Vielleicht ist dies ein eingebauter Stolperstein (Feature), um uns zu zwingen, in dieses Problem zu kommen, ziehen Sie unsere Haare darüber hinaus, dann erkennen, wie vielseitig der Funktionshandler sein kann ...