2017-02-08 32 views
5

पर पोस्ट करना मेरे पास एक साधारण सी # Aws Lambda फ़ंक्शन है जो लैम्ब्डा कंसोल टेस्ट से परीक्षण में सफल होता है लेकिन एपीआई गेटवे (जिसे मैंने उत्पन्न किया है) से 502 (खराब गेटवे) के साथ विफल रहता है ।एडब्ल्यूएस-एपीआई गेटवे से लैम्ब्डा

Wed Feb 08 14:14:54 UTC 2017 : Endpoint response body before transformations: { 
    "errorType": "NullReferenceException", 
    "errorMessage": "Object reference not set to an instance of an object.", 
    "stackTrace": [ 
    "at blahblahmynamespace.Function.FunctionHandler(ZipRequest input, ILambdaContext context)", 
    "at lambda_method(Closure , Stream , Stream , ContextInfo)" 
    ] 
} 

यह की तरह लगता है: लैम्ब्डा ट्रिगर विकल्प) है और यह भी अगर मैं डाकिया का उपयोग)

// request header 
    Content-Type: application/json 

// request body 
    { 
     "userid":22, 
     "files":["File1","File2","File3","File4"] 
    } 

त्रुटि मैं लॉग में मिलता है (इस प्रारंभिक समारोह ओपन एक्सेस (कोई सुरक्षा है) पोस्ट ऑब्जेक्ट लैम्ब्डा इनपुट तर्क में पारित नहीं किया जा रहा है।

कोड

नीचे
// Lambda function 
    public LambdaResponse FunctionHandler(ZipRequest input, ILambdaContext context) 
     { 
      try 
      { 
       var logger = context.Logger; 
       var headers = new Dictionary<string, string>(); 

       if (input == null || input.files.Count == 0) 
       { 
        logger.LogLine($"input was null"); 
        headers.Add("testheader", "ohdear"); 
        return new LambdaResponse { body = "fail", headers = headers, statusCode = HttpStatusCode.BadRequest }; 
       } 
       else 
       { 
        logger.LogLine($"recieved request from user{input?.userid}"); 
        logger.LogLine($"recieved {input?.files?.Count} items to zip"); 
        headers.Add("testheader", "yeah"); 
        return new LambdaResponse { body = "hurrah", headers = headers, statusCode = HttpStatusCode.OK }; 
       } 
      } 
      catch (Exception ex) 
      { 
       throw ex; 
      } 
     } 

// लैम्ब्डा प्रतिक्रिया/ZipRequest वर्ग

public class LambdaResponse 
{ 

    public HttpStatusCode statusCode { get; set; } 
    public Dictionary<string, string> headers { get; set; } 
    public string body { get; set; } 
} 
public class ZipRequest 
{ 
    public int userid { get; set; } 
    public IList<string> files { get; set; } 
} 

उत्तर

3

एपीआई गेटवे में लैम्ब्डा प्रॉक्सी एकता का उपयोग कर, अपने FunctionHandler को पहले पैरामीटर अपनी पोस्ट के शरीर नहीं है, लेकिन एक और एपीआई गेटवे-निर्मित ऑब्जेक्ट है, जो LambdaRequest पर कॉल करें। इन परिवर्तनों को अपने नमूना कोड में आज़माएं। जोड़ें:

public class LambdaRequest 
{ 
    public string body { get; set; } 
} 

करने के लिए अपने हैंडलर प्रोटोटाइप बदलें:

ZipRequest input = JsonConvert.DeserializeObject<ZipRequest>(req.Body); 

पूर्ण LambdaRequest वस्तु एडब्ल्यूएस डॉक्स में Input Format of a Lambda Function for Proxy Integration के तहत दर्ज है, और शामिल HTTP: और

public LambdaResponse FunctionHandler(LambdaRequest req, ILambdaContext context) 

FunctionHandler ऐड अंदर शीर्षलेख, HTTP विधि, क्वेरी स्ट्रिंग, शरीर, और कुछ अन्य चीजें।

5

यह उपलब्ध किया गया हो सकता है नहीं किया है जब ओपी प्रश्न पूछा है, लेकिन जब एपीआई गेटवे का उपयोग कर एक लैम्ब्डा समारोह लागू, विशिष्ट प्रतिक्रिया वस्तुओं प्रदान की जाती हैं।

जैसा कि पहले प्रलेखन Api Gateway Simple Proxy for Lambda Input Format में नोट किया गया था, एपीआई गेटवे इनपुट वर्जन को काफी वर्बोज़ रैपर में लपेटता है। यह एक समान वर्बोज़ प्रतिक्रिया ऑब्जेक्ट की भी अपेक्षा करता है।

हालांकि, यह कस्टम अनुरोध और प्रतिक्रिया वस्तुओं को बनाने के लिए आवश्यक नहीं है। एडब्ल्यूएस टीम Amazon.Lambda.APIGatewayEvents लाइब्रेरी प्रदान करती है, जो NuGet पर भी उपलब्ध है। इस पुस्तकालय में APIGatewayProxyRequest और APIGatewayProxyResponse ऑब्जेक्ट तैयार हैं।

अनुरोध के Body मैन्युअल रूप से deserialize करने के लिए अभी भी आवश्यक है, क्योंकि यह एक स्ट्रिंग है, JSON ऑब्जेक्ट नहीं। मुझे लगता है कि यह लचीलापन के लिए किया गया था?

एक उदाहरण समारोह ऐसा दिखाई दे सकता।

public APIGatewayProxyResponse FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context) 
    { 
     var bodyString = request?.Body; 

     if (!string.IsNullOrEmpty(bodyString)) 
     { 
      dynamic body = JsonConvert.DeserializeObject(bodyString); 

      if (body.input != null) 
      { 
       body.input = body.input?.ToString().ToUpper(); 

       return new APIGatewayProxyResponse 
       { 
        StatusCode = 200, 
        Body = JsonConvert.SerializeObject(body) 
       }; 
      } 
     } 

     return new APIGatewayProxyResponse 
     { 
      StatusCode = 200 
     }; 
    } 
: यह डिफ़ॉल्ट समारोह के संशोधन एडब्ल्यूएस उपकरण द्वारा प्रदान की है
संबंधित मुद्दे