本文介绍C#事件请求处理程序的结构和特点。
处理程序接口
当您创建一个基于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);
- 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
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
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){}
}
}
- 命名空间和类
命名空间为
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格式的事件回调处理程序。