引言:为什么无服务器和C#是理想组合
\n无服务器架构(或无服务器计算)是一种您编写代码而无需操心服务器管理的模型。AWS Lambda是运行此类代码最流行的服务之一。与C#(.NET)结合,您将获得一个强大、类型安全且高性能的工具,用于创建微服务、API处理程序和后台任务。
\n在本文中,我们将剖析完整流程:从环境配置到在AWS Lambda中部署和监控第一个C#函数。本材料既适合新手,也适合希望系统化知识的有经验的开发者。
\n\n1. 环境准备与项目创建
\n1.1 工具安装
\n使用C#和AWS Lambda需要以下工具:
\n- \n
- .NET SDK (8.0或6.0) — 从 dotnet.microsoft.com 下载; \n
- AWS CLI — 用于从终端管理资源; \n
- Amazon.Lambda.Tools — 用于部署的.NET全局工具。 \n
使用一条命令安装Lambda Tools:
\ndotnet tool install -g Amazon.Lambda.Tools\n\n1.2 创建函数模板
\n使用内置模板快速开始:
\ndotnet new lambda.EmptyFunction --name MyFirstLambda --profile default --region us-east-1\n此命令将创建一个包含 Function.cs 文件和用于部署配置的 aws-lambda-tools-defaults.json 的项目。
2. 用C#编写无服务器函数代码
\n2.1 Lambda函数的基本结构
\n每个Lambda函数都是一个接受事件对象和执行上下文的方法。来看一个最简单的示例:
\nusing Amazon.Lambda.Core;\nusing Amazon.Lambda.SQSEvents;\n\n[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]\n\npublic class Function\n{\n public async Task<string> FunctionHandler(SQSEvent evnt, ILambdaContext context)\n {\n context.Logger.LogInformation("收到消息数:" + evnt.Records.Count);\n \n foreach (var record in evnt.Records)\n {\n await ProcessMessageAsync(record.Body, context);\n }\n \n return "已处理 " + evnt.Records.Count + " 条消息";\n }\n\n private async Task ProcessMessageAsync(string messageBody, ILambdaContext context)\n {\n context.Logger.LogInformation("处理中:" + messageBody);\n await Task.Delay(100); // 模拟工作\n }\n}\n请注意 LambdaSerializer 属性——它指定如何序列化/反序列化JSON。对于C#,推荐使用 SystemTextJson。
2.2 使用不同的触发器
\nAWS Lambda支持多种事件源。以下是通过API Gateway处理HTTP请求的示例:
\npublic async Task<APIGatewayProxyResponse> FunctionHandler(APIGatewayProxyRequest request, ILambdaContext context)\n{\n var name = request.QueryStringParameters?.ContainsKey("name") == true \n ? request.QueryStringParameters["name"] \n : "世界";\n \n var responseBody = $"你好,{name}!";\n \n return new APIGatewayProxyResponse\n {\n StatusCode = 200,\n Body = responseBody,\n Headers = new Dictionary<string, string> { { "Content-Type", "text/plain" } }\n };\n}\n要使用HTTP,需要安装 Amazon.Lambda.APIGatewayEvents 包。
3. 函数部署与测试
\n3.1 本地测试
\n在部署前,使用 dotnet lambda invoke 在本地检查代码:
dotnet lambda invoke --payload "{\\"Records\