2017-02-23 10 views
5

मैं सी # में एडब्ल्यूएस लैम्ब्डा फ़ंक्शन लिखने का प्रयास कर रहा हूं। मेरे पास विजुअल स्टूडियो 2015 के लिए एडब्ल्यूएस टूलकिट है। मैंने एडब्ल्यूएस लैम्ब्डा प्रोजेक्ट (नेट कोर) के साथ एक प्रोजेक्ट बनाया है और फिर खाली फ़ंक्शन विकल्प चुना है। - टिप्पणी के रूप में चिह्नित उत्तर उपयोगी ज्ञान था, लेकिन मेरे लिए वास्तविक जवाब नहीं थासी # में अमेज़ॅन लैम्ब्डा - जेसन रीडर अपवाद

अद्यतन & उत्तर 02/24/17: जो मेरा पीछा कोड दे दी है। यह @PavelSafronov की उस टिप्पणी में टिप्पणी थी जिसने चाल बनाई थी। मैं या तो कुछ भी पास नहीं कर रहा था (और त्रुटि प्राप्त कर रहा था) या मुझे लगता है कि यह चाहता था कि मैं जेएसओएन प्रारूप में जानकारी देना चाहता हूं, इसलिए मैं { "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'. 

हालांकि, यह असफल होने के बिना एडब्ल्यूएस को निर्मित और प्रकाशित करेगा। मैं भी यह आह्वान कर सकते हैं जो रिटर्न निम्नलिखित - और मेरे मुख्य प्रश्न है:

{ 
    "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.1.0 को 1.0.0 से NuGet पैकेज Microsoft.NETCore.App अद्यतन करने के लिए करने की कोशिश की और कहा कि साथ ही और भी वापस 1.0.1 लिए कुछ नहीं किया।

मुझे वह डिफ़ॉल्ट उदाहरण मिलेगा जो वे आपको देंगे, लेकिन मैं वहां गलत हूं। ऐसा लगता है कि Amazon.Lambda.Serialization.Json.JsonSerializer विशेषता के साथ समस्याएं हैं। क्या NewtonSoft का उपयोग करना संभव है?

+1

पुन: "हालांकि, जहां तक मुझे चिंतित है, यह एक बग की तरह लगता है। एक स्ट्रिंग डिफ़ॉल्ट रूप से शून्य है ... "- unquoted' null' मान्य JSON है, और यदि यह किसी फ़ंक्शन में पारित होता है जो स्ट्रिंग की अपेक्षा करता है, तो स्ट्रिंग पैरामीटर शून्य होगा। इसे एडब्ल्यूएस लैम्ब्डा कंसोल का उपयोग करके सत्यापित किया जा सकता है और परीक्षण जेएसओएन पेलोड के रूप में 'शून्य' निर्दिष्ट किया जा सकता है, लेकिन * नहीं * एडब्ल्यूएस वीएस टूलकिट, क्योंकि टूलकिट स्ट्रिंग (सुविधा के लिए) के रूप में बिना छेड़छाड़ वाले पाठ का इलाज करता है और इसे लैम्ब्डा को पास करने से पहले उद्धृत करता है । –

उत्तर

2

थोड़ा सा सीमित में सीडब्ल्यू में एडब्ल्यूएस लैम्ब्डा के साथ मेरा अनुभव, लेकिन यह त्रुटि है जब इनपुट ("परीक्षण" डेटा यदि आप कंसोल से फ़ंक्शन ट्रिगर कर रहे हैं) वास्तविक JSON प्रारूप में नहीं है ।सबसे अच्छा शर्त आपके परीक्षण उद्देश्यों के लिए एक डमी इनपुट क्लास बनाने के लिए हो सकती है और उसके बाद लैम्ब्डा को समान रूप से क्रमबद्ध करने के लिए समकक्ष JSON डेटा दें।

आपके प्रोजेक्ट.जेसन के लिए, मुझे पहले एडब्ल्यूएस लैम्ब्डा के लिए रनटाइम अनुभाग जोड़ने की आवश्यकता नहीं है। मदद करता है कि https://gist.github.com/TAGray/8cc812065c3b6abcd732b7f6a3bda92a

आशा: आप तो करते हैं आप इस सूची से प्रासंगिक runtimes का चयन करना होगा: यदि आप पाते हैं कि उपयोगी https://docs.microsoft.com/en-us/dotnet/articles/core/rid-catalog

इसके अलावा यहां एक उदाहरण project.json फ़ाइल है।

+0

जब परिणाम सफल होता है तो परिणामस्वरूप विंडो में, एक टेस्ट फ़ंक्शन होता है। कॉन्फ़िगरेशन | घटना स्रोत | लॉग विकल्प - मैं टेस्ट फ़ंक्शन पर हूं जहां मैंने उदाहरण अनुरोध में और उसके नीचे दिए गए बॉक्स में कुछ भी नहीं रखा है। मैं आमंत्रित करता हूं और ''JsonReaderException'' संदेश प्राप्त करता हूं। मैंने '' {"इनपुट": "कुछ"} '' के वैध JSON में डाल दिया और एक ही संदेश प्राप्त किया। – Grandizer

+0

मैंने एक नई परियोजना बनाई जैसा मैंने वर्णन किया था, इस समय मैंने इसे "टेस्ट के साथ" इस्तेमाल किया था। यह पता लगाना कि "टेस्ट फ़ंक्शन" विकल्प केवल एक वास्तविक टेस्ट फ़ंक्शन हो सकता है (यहां स्ट्रॉ पर grasping।) इस नई परियोजना के भीतर गैर परीक्षण समारोह का उपयोग, एक ही त्रुटि 'JsonReaderException''। मैं वास्तविक परीक्षण फ़ंक्शन के लिए पूर्ण पथ का उपयोग करने में सक्षम नहीं हूं क्योंकि यह वास्तव में पैकेज का हिस्सा नहीं है। मैं कमांड लाइन (एडब्ल्यूएस सीएलआई) – Grandizer

+5

के माध्यम से इनमें से कोई भी नहीं कर रहा हूं प्रश्न में फ़ंक्शन एक स्ट्रिंग की अपेक्षा कर रहा है, इसलिए आपको उद्धृत स्ट्रिंग में गुजरना चाहिए।यदि आपका कार्य जटिल प्रकार की अपेक्षा कर रहा है तो आप जेएसओएन ऑब्जेक्ट्स में गुजरेंगे। –

2

प्रति पावेल साफ्रोनोव -

हाँ यदि आप एक नहीं स्ट्रिंग एक json वस्तु में प्रवेश जानी चाहिए जब आपके लैम्ब्डा समारोह प्रवेश बिंदु है:

public string KevinsTestFunction(string input, ILambdaContext context) { 

फिर स्ट्रिंग दर्ज कर सकते है:

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

आप लैम्ब्डा फ़ंक्शंस एंट्री पॉइंट को भी बदल सकते हैं:

public string KevinsTestFunction(JObject input, ILambdaContext context) { 
आप किसी भी इनपुट की उम्मीद नहीं कर रहे हैं और केवल मतदान एक SQS कतार या DynamoDb तालिका तो आप को लैम्ब्डा समारोह के प्रवेश बिंदु बदल सकता है

{ "input": "Something" } 

:

तो फिर तुम तो जैसे एक json वस्तु दर्ज कर सकते हैं

public string KevinsTestFunction(ILambdaContext context) { 

के साथ खेलने के लिए कई भिन्नताएं।


अब मूल प्रश्न में अद्यतन प्रति, डिफ़ॉल्ट रूप से एडब्ल्यूएस वेब कंसोल टेस्ट क्षेत्र आप डिफ़ॉल्ट परीक्षण डाटा के साथ सेट हो जाएगा अपने लैम्ब्डा समारोह को भेजना चाहिए। वह डिफ़ॉल्ट परीक्षण डेटा एक JSON ऑब्जेक्ट है। जैसा कि नोट किया गया है कि यह एडब्ल्यूएस एसडीके के माध्यम से विजुअल स्टूडियो के माध्यम से उपलब्ध सी # लैम्ब्डास (जो स्ट्रिंग इनपुट स्वीकार करता है) के लिए डिफ़ॉल्ट टेम्पलेट्स के साथ बाधाओं पर है। शायद यह इस मुद्दे में भागने के लिए मजबूर करने के लिए अवरुद्ध ब्लॉक (फीचर) में बनाया गया है, हमारे बालों को बाहर खींचें, फिर एहसास करें कि फ़ंक्शन हैंडलर कितना बहुमुखी हो सकता है ...

संबंधित मुद्दे