Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在C语言中调用AWS Lambda函数_C#_Amazon Web Services_Aws Lambda_Fire And Forget - Fatal编程技术网

C# 在C语言中调用AWS Lambda函数

C# 在C语言中调用AWS Lambda函数,c#,amazon-web-services,aws-lambda,fire-and-forget,C#,Amazon Web Services,Aws Lambda,Fire And Forget,我正在尝试从控制台应用程序运行Lambda函数。它的想法是在不等待lambda函数返回的情况下运行一个快速启动&忘记lambda函数。我的代码似乎根本没有执行lambda函数。我知道这个函数可以工作,因为我可以运行测试。当我运行下面的代码时,我只得到一个TaskCancelled异常 var jsonSerializer = new JsonSerializer(); var lambdaConfig = new AmazonLambdaConfig() { RegionEndpoint = R

我正在尝试从控制台应用程序运行Lambda函数。它的想法是在不等待lambda函数返回的情况下运行一个快速启动&忘记lambda函数。我的代码似乎根本没有执行lambda函数。我知道这个函数可以工作,因为我可以运行测试。当我运行下面的代码时,我只得到一个TaskCancelled异常

var jsonSerializer = new JsonSerializer();
var lambdaConfig = new AmazonLambdaConfig() { RegionEndpoint = RegionEndpoint.USEast2 };
var lambdaClient = new AmazonLambdaClient(lambdaConfig);

using (var memoryStream = new MemoryStream())
{
    jsonSerializer.Serialize(myData, memoryStream);
    var lambdaRequest = new InvokeRequest
    {
        FunctionName = "MyFunction",
        InvocationType = "Event",
        PayloadStream = memoryStream
};

var result = Task.Run(async () => { return await lambdaClient.InvokeAsync(lambdaRequest); }).Result;
有人知道我做错了什么吗


谢谢

混合阻塞调用可能会导致死锁。如果目的是激发和获取,那么只需调用所需的函数。还有,为什么只给请求一个流,以便在请求之后处理它呢

public static void Main(string[] args) {    
    var jsonSerializer = new JsonSerializer();
    var lambdaConfig = new AmazonLambdaConfig() { RegionEndpoint = RegionEndpoint.USEast2 };
    var lambdaClient = new AmazonLambdaClient(lambdaConfig);

    var memoryStream = new MemoryStream();

    jsonSerializer.Serialize(myData, memoryStream);
    var lambdaRequest = new InvokeRequest
    {
        FunctionName = "MyFunction",
        InvocationType = "Event",
        PayloadStream = memoryStream
    };

    lambdaClient.InvokeAsync(lambdaRequest);

    Console.ReadLine();
}

Nkosi答案中的FunctionName实际上应该是lambda函数的整个ARN,因此从Nkosi的答案中可以看出:

public static void Main(string[] args) {    
var jsonSerializer = new JsonSerializer();
var lambdaConfig = new AmazonLambdaConfig() { RegionEndpoint = RegionEndpoint.USEast2 };
var lambdaClient = new AmazonLambdaClient(lambdaConfig);

var memoryStream = new MemoryStream();

jsonSerializer.Serialize(myData, memoryStream);
var lambdaRequest = new InvokeRequest
{
    FunctionName = "arn:aws:lambda:ap-southeast-2:{id}:function:MyFunction",
    InvocationType = "Event",
    PayloadStream = memoryStream
};

lambdaClient.InvokeAsync(lambdaRequest);

Console.ReadLine();
如果数据是带双引号的有效JSON,则可以直接传递myData,而不是转换为MemoryStream

在函数名中,您可以使用ARN或仅使用名称。在最新版本AWSSDK.Lambda-version3.3.103.31中,这两个版本对我来说都很好


我认为您的代码中有两个问题:

@Nikosi提到,在将memoryStream用于lambda调用之前,您会先处理它 在我的例子中,当您将负载序列化到内存流中时,该修复有助于将负载序列化到内存流中,流中的位置指向其结束后的字节,因此SDK无需从中读取任何内容。所以我用了memoryStream.Seek0L,SeekOrigin.Begin 顺便说一下,假设JsonSerializer是来自Newtonsoft.Json包的,我没有找到接受流参数的Serialize方法,只有TextWriter或JsonWriter。因此,可能需要将其包装到StreamWriter中,并确保在将内存流用作Lambda负载之前调用Flush或FlushAsync或dispose StreamWriter,如下所示:

await using var stream = new MemoryStream();
await using var streamWriter = new StreamWriter(stream);
var serializer = new JsonSerializer();
serializer.Serialize(streamWriter, payload);
await streamWriter.FlushAsync();
stream.Seek(0L, SeekOrigin.Begin);

log.LogInformation("Batch {0}: sending {1} messages to Lambda", batchId, batch.Count);

var lambdaResponse = await lambda.InvokeAsync(new InvokeRequest
{
    InvocationType = InvocationType.RequestResponse,
    PayloadStream = stream,
    //Payload = JsonConvert.SerializeObject(payload),
    FunctionName = lambdaArn
}, stoppingToken);

您提出的代码是我开始使用的,不幸的是,lambda函数从未被调用,程序完成,但函数从未被激发。我开始在任务中包装它。运行只是为了看看它是否会返回一个积极或消极的响应。嗨,科里,你有没有让这个工作?我也遇到了同样的问题。我必须尝试一下,我最终放弃了这个,转而使用了我编写的azure函数。我想看看我是否能让它变得多余。谢谢
await using var stream = new MemoryStream();
await using var streamWriter = new StreamWriter(stream);
var serializer = new JsonSerializer();
serializer.Serialize(streamWriter, payload);
await streamWriter.FlushAsync();
stream.Seek(0L, SeekOrigin.Begin);

log.LogInformation("Batch {0}: sending {1} messages to Lambda", batchId, batch.Count);

var lambdaResponse = await lambda.InvokeAsync(new InvokeRequest
{
    InvocationType = InvocationType.RequestResponse,
    PayloadStream = stream,
    //Payload = JsonConvert.SerializeObject(payload),
    FunctionName = lambdaArn
}, stoppingToken);