相关文章推荐
路过的帽子  ·  .Net ...·  1 周前    · 
另类的路灯  ·  C++ ...·  2 天前    · 
憨厚的佛珠  ·  今天我的jupyter ...·  1 年前    · 
从容的柳树  ·  c++ - How to change ...·  1 年前    · 
一身肌肉的大葱  ·  Saving files to ...·  1 年前    · 

处理程序接口

当您创建一个基于C#的函数时,需要指定一个Handler方法,该方法在函数执行时被执行。这个Handler方法可以是Static方法或Instance方法。如果您想在Handler方法中访问 IFcContext 对象,则需要将该方法中的第二个参数指定为 IFcContext 对象。事件函数支持的Handler方法定义如下所示。

ReturnType HandlerName(InputType input, IFcContext context);  //包含IFcContext。
ReturnType HandlerName(InputType input); // 不包含IFcContext。
Async Task<ReturnType> HandlerName(InputType input, IFcContext context);
Async Task<ReturnType> HandlerName(InputType input);
函数计算 支持在使用C#编写的函数中应用Async,此时函数的执行会等待异步方法执行结束。以下是对ReturnType、InputType和IFcContext的说明。
  • ReturnType :返回对象可以是 void System.IO.Stream 对象或者任何可以被JSON序列化和反序列化的对象。如果返回对象是Stream,该Stream内容将直接在响应体返回,否则返回对象被JSON序列化后,在响应体返回。
  • InputType :输入参数可以是System.IO.Stream或任何可以被JSON序列化和反序列化的对象。
  • IFcContext :函数的Context对象。更多信息,请参见 上下文

    事件请求处理程序类型

    函数计算使用C#编写函数,需要引入 Aliyun.Serverless.Core 依赖包,可以通过以下方式在 .csproj 文件中引入该依赖包。

      <ItemGroup>
            <PackageReference Include="Aliyun.Serverless.Core" Version="1.0.1" />
      </ItemGroup>

    Aliyun.Serverless.Core 包为事件请求处理程序定义了两个参数类型。

  • Stream Handler

    以流的方式接收输入的 event 事件并返回执行结果,您需要从输入流中读取调用函数时的输入,处理完成后把函数执行结果写入到输出流中来返回。

  • POCO Handler

    通过POCO(Plain old CLR objects)方式,您可以自定义输入和输出的类型,但是输入和输出的类型必须是POCO类型。

    Stream Handler

    一个最简单的Stream Handler示例如下所示。
    using System.IO;
    using System.Threading.Tasks;
    using Aliyun.Serverless.Core;
    using Microsoft.Extensions.Logging;
    namespace Example
        public class Hello
            public async Task<Stream> StreamHandler(Stream input, IFcContext context)
                IFcLogger logger = context.Logger;
                logger.LogInformation("Handle request: {0}", context.RequestId);
                MemoryStream copy = new MemoryStream();
                await input.CopyToAsync(copy);
                copy.Seek(0, SeekOrigin.Begin);
                return copy;
            static void Main(string[] args){}
                      
    示例解析如下。
  • 命名空间和类

    命名空间为Example,类名为Hello,方法名为StreamHandler,假设程序集名称为HelloFcApp,则请求处理程序的配置为HelloFcApp::Example.Hello::StreamHandler

  • 参数Stream input

    处理程序的输入,该示例的输入类型为Stream。

  • 参数IFcContext context(可选)

    上下文对象,包含函数和请求的信息。

  • 返回值Task<Stream>

    返回值为Stream类型。

    POCO Handler

    一个最简单的POCO Handler示例如下所示。
    using Aliyun.Serverless.Core;
    using Microsoft.Extensions.Logging;
    namespace Example
        public class Hello
            public class Product
                public string Id { get; set; }
                public string Description { get; set; }
            // optional serializer class, if it’s not specified, the default serializer (based on JSON.Net) will be used.
            // [FcSerializer(typeof(MySerialization))]
            public Product PocoHandler(Product product, IFcContext context)
                string Id = product.Id;
                string Description = product.Description;
                context.Logger.LogInformation("Id {0}, Description {1}", Id, Description);
                return product;
            static void Main(string[] args){}
                      
    除了Stream作为输入输出参数,POCO(Plain old CLR objects)对象同样也可以作为输入和输出。如果该POCO没有指定特定的JSON序列化对象,则函数计算默认使用JSON.Net进行对象的JSON序列化和反序列化。具体解析如下。
  • 命名空间和类

    命名空间为Example,类名为Hello,方法名为PocoHandler,假设程序集名称为 HelloFcApp, 则请求处理程序的配置为HelloFcApp::Example.Hello::PocoHandler

  • 参数Product product

    处理程序的输入,该示例的输入类型为Product Class。如果该POCO没有指定特定的JSON序列化对象,则函数计算默认使用JSON.Net进行对象的JSON反序列化。

  • 参数IFcContext context(可选)

    上下文对象,包含函数和请求的信息。

  • 返回值Product

    返回值为POCO Product类型。如果该POCO没有指定特定的JSON序列化对象,则函数计算默认使用JSON.Net进行对象的JSON序列化。

    自定义序列化接口(Custom Serializer)

    函数计算针对POCO Handler提供了默认的基于JSON .NET的序列化接口。如果默认的序列化接口不能满足需求,您可以基于Aliyun.Serverless.Core中的接口IFcSerializer实现自定义序列化接口。

    public interface IFcSerializer
        T Deserialize<T>(Stream requestStream);
        void Serialize<T>(T response, Stream responseStream);
                      
    函数计算官方库包含使用各种处理程序类型和接口的示例应用程序。每个示例应用程序都包含用于轻松编译部署的方法。
  • dotnet3-blank-stream-event:使用Stream格式的事件回调处理程序。
  • dotnet3-blank-poco-event:使用POCO格式的事件回调处理程序。
  •