更新时间:2025-08-05 GMT+08:00
分享

使用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
图1 查看dotnet版本信息

步骤一:创建工程

如果使用FunctionGraph服务提供的样例程序包fss_example_csharp2.0,请直接执行步骤二:测试函数

  1. 打开IDE,如图2所示创建C#编译工程,框架选择“net6.0”
    图2 创建工程
  2. 工程新建完成后,目录结构如所示。
    图3 工程目录结构
  3. 下载FunctionGraph函数的dll文件,如图4所示将dll文件解压到该目录。
    图4 dll文件解压到目录
  4. 编辑项目中的“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所示。

    图5 csproj文件
  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. 图6所示,使用IDE的“编译”按钮编译C#工程。
    图6 编译C#按钮
  7. 图7所示将“ConsoleApp1\bin\Debug\net6.0”路径下编译好的所有文件打包为zip格式文件。请注意不要将整个文件夹进行打包,需确保压缩包解压后直接出现文件。
    图7 打包编译文件

步骤二:测试函数

  1. 登录函数工作流控制台,右上角单击“创建函数”
  2. 图8所示,创建一个空白的C#事件函数,单击“立即创建”进入函数详情页。
    图8 创建函数

  3. 上传7打包的zip文件,如图9所示,代码包上传后将在FunctionGraph控制台自动部署。
    图9 上传代码
  4. 图10所示,选择“设置 > 常规设置”,将函数执行入口配置为"ConsoleApp1::src.Program::myFunc",单击“保存”

    样例工程包中的C#工程编译后生成的文件为ConsoleApp1.dll,因此函数执行入口中的程序集名为ConsoleApp1。

    图10 配置函数执行入口
  5. 回到“代码”页签,单击“测试”配置一个空白测试事件。
  6. 图11所示,选择已创建的空白测试事件,单击“测试”,查看函数执行结果。
    图11 测试函数

执行结果

执行结果由3部分组成:函数返回、执行摘要和日志。

表1 执行结果说明

参数项

执行成功

执行失败

函数返回

返回函数中定义的返回信息。

返回包含错误信息和错误类型的JSON文件。格式如下:

{
    "errorMessage": "",
    "errorType": ""
}

errorMessage:Runtime返回的错误信息

errorType:错误类型

执行摘要

显示请求ID、配置内存、执行时长、实际使用内存和收费时长。

显示请求ID、配置内存、执行时长、实际使用内存和收费时长。

日志

打印函数日志,最多显示4KB的日志。

打印报错信息,最多显示4KB的日志。

相关文档