使用IDE开发C#事件函数
本章节介绍使用IDE工具开发C#事件函数的流程。关于C#函数接口定义、Initializer入口介绍以及SDK接口说明请参考C#函数开发概述。
约束与限制
通过APIG服务调用函数服务时,isBase64Encoded的值默认为true,表示APIG传递给FunctionGraph的请求体body已经进行Base64编码,需要先对body内容Base64解码后再处理。
{ "isBase64Encoded": true|false, "statusCode": httpStatusCode, "headers": {"headerName":"headerValue",...}, "body": "..." }
查看dotnet版本信息
输入以下命令查看已安装的.NET版本信息。
dotnet --info

步骤一:创建工程
如果使用FunctionGraph服务提供的样例程序包fss_example_csharp2.0,请直接执行步骤二:测试函数。
- 打开IDE,如图2所示创建C#编译工程,框架选择“net6.0”。
- 工程新建完成后,目录结构如所示。
图3 工程目录结构
- 下载FunctionGraph函数的dll文件,如图4所示将dll文件解压到该目录。
- 编辑项目中的“ConsoleApp1.csproj”文件,使该项目能够引用下载的dll文件,文件内容新增如下:
<ItemGroup> <Reference Include="HC.Serverless.Function.Common, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"> <HintPath>../HC.Serverless.Function.Common.dll</HintPath> </Reference> </ItemGroup>
编辑完成后cspoj文件内容如图5所示。
- 编辑项目中的“Program.cs”文件,使用如下代码直接替换文件中原有的代码:
using HC.Serverless.Function.Common; using System; using System.IO; using System.Text; namespace src { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } public Stream myFunc(Stream input,IFunctionContext context) { string payload = ""; if (input != null && input.Length > 0) { byte[] buffer = new byte[input.Length]; input.Read(buffer, 0, (int)(input.Length)); payload = Encoding.UTF8.GetString(buffer); } var ms = new MemoryStream(); using (var sw = new StreamWriter(ms)) { sw.WriteLine("CSharp runtime test(v1.0.2)"); sw.WriteLine("====================================="); sw.WriteLine("Request Id: {0}", context.RequestId); sw.WriteLine("Function Name: {0}", context.FunctionName); sw.WriteLine("Function Version: {0}", context.FunctionVersion); sw.WriteLine("Project: {0}", context.ProjectId); sw.WriteLine("Package: {0}", context.PackageName); sw.WriteLine("Security Access Key: {0}", context.SecurityAccessKey); sw.WriteLine("Security Secret Key: {0}", context.SecuritySecretKey); sw.WriteLine("Security Token: {0}", context.SecurityToken); sw.WriteLine("Token: {0}", context.Token); sw.WriteLine("User data(ud-a): {0}", context.GetUserData("ud-a")); sw.WriteLine("User data(ud-notexist): {0}", context.GetUserData("ud-notexist", "")); sw.WriteLine("User data(ud-notexist-default): {0}", context.GetUserData("ud-notexist", "default value")); sw.WriteLine("====================================="); var logger = context.Logger; logger.Logf("Hello CSharp runtime test(v1.0.2)"); sw.WriteLine(payload); } return new MemoryStream(ms.ToArray()); } } }
- 如图6所示,使用IDE的“编译”按钮编译C#工程。
- 如图7所示将“ConsoleApp1\bin\Debug\net6.0”路径下编译好的所有文件打包为zip格式文件。请注意不要将整个文件夹进行打包,需确保压缩包解压后直接出现文件。
步骤二:测试函数
- 登录函数工作流控制台,右上角单击“创建函数”。
- 如图8所示,创建一个空白的C#事件函数,单击“立即创建”进入函数详情页。
- 上传7打包的zip文件,如图9所示,代码包上传后将在FunctionGraph控制台自动部署。
- 如图10所示,选择“设置 > 常规设置”,将函数执行入口配置为"ConsoleApp1::src.Program::myFunc",单击“保存”。
样例工程包中的C#工程编译后生成的文件为ConsoleApp1.dll,因此函数执行入口中的程序集名为ConsoleApp1。
- 回到“代码”页签,单击“测试”配置一个空白测试事件。
- 如图11所示,选择已创建的空白测试事件,单击“测试”,查看函数执行结果。
执行结果
执行结果由3部分组成:函数返回、执行摘要和日志。
参数项 |
执行成功 |
执行失败 |
---|---|---|
函数返回 |
返回函数中定义的返回信息。 |
返回包含错误信息和错误类型的JSON文件。格式如下: { "errorMessage": "", "errorType": "" } errorMessage:Runtime返回的错误信息 errorType:错误类型 |
执行摘要 |
显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 |
显示请求ID、配置内存、执行时长、实际使用内存和收费时长。 |
日志 |
打印函数日志,最多显示4KB的日志。 |
打印报错信息,最多显示4KB的日志。 |