このトピックでは、C# のイベントハンドラーの構造と特性について説明します。
Handlerインターフェイス
C# 関数を作成するときは、関数と共に実行されるハンドラーメソッドを指定する必要があります。 このHandlerメソッドは、静的メソッドまたはインスタンスメソッドのいずれかです。 ハンドラーメソッドでIFcContext
オブジェクトにアクセスするには、このメソッドの2番目のパラメーターをIFcContext
に設定する必要があります。 次の例は、Function Computeでサポートされているハンドラーメソッドを示しています。
ReturnType HandlerName(InputType input, IFcContext context); //IFcContext included
ReturnType HandlerName(InputType input); //IFcContext not included
Async Task<ReturnType> HandlerName(InputType input, IFcContext context);
Async Task<ReturnType> HandlerName(InputType input);
Function Computeは、C# で定義された関数でAsyncの使用をサポートしています。この関数は、非同期メソッドの実行後に実行されます。 上記の定義では:
ReturnTypeは返されるオブジェクトです。
void
、System.IO.Stream
、またはJSONシリアル化または逆シリアル化されたオブジェクトです。 Streamオブジェクトが返された場合、Streamオブジェクトの内容は応答本文で直接返されます。 それ以外の場合、オブジェクトはJSON形式でシリアル化された後、レスポンス本文で返されます。InputTypeは、入力パラメーターを示します。これは、System.IO.StreamまたはJSONシリアル化または逆シリアル化されたオブジェクトです。
IFcContextは、関数のコンテキストオブジェクトを示します。 詳細は、「コンテキスト」をご参照ください。
イベントハンドラー
Function ComputeはC# を使用して関数を記述します。 Aliyun.Serverless.Core
依存関係パッケージを導入する必要があります。 このパッケージは、. csproj次の方法を使用してファイルを作成します。
<ItemGroup>
<PackageReference Include="Aliyun.Serverless.Core" Version="1.0.1" />
</ItemGroup>
Aliyun.Serverless.Core
パッケージは、イベントハンドラーの2つのパラメータータイプを定義します。
Stream Handler
ストリームを使用して入力
イベント
データを受け取り、実行結果を返します。 入力ストリームから入力データを読み取り、実行結果を出力ストリームに書き込む必要があります。POCOハンドラー
単純な古いクラスオブジェクト (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パラメーター
ハンドラーへの入力。The input to the handler. この例の入力タイプはStreamです。
(オプション) IFcContext contextパラメーター
関数とリクエストに関する情報を含むコンテキストオブジェクト。
タスク <Stream> の応答
戻り値。Stream型です。
POCOハンドラー
次の例は、単純なPOCOハンドラーのサンプルコードを提供します。
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 is 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も入力および出力パラメータとして使用できます。 POCOが特定のJSONシリアル化オブジェクトを指定していない場合、Function ComputeはJSON.Netを使用してJSONシリアル化とオブジェクトの逆シリアル化を実行します。 上記のサンプルコードでは、
名前空間とクラス
名前空間は
Example
、クラス名はHello
、メソッド名はPocoHandler
です。 アセンブリ名がHelloFcApp
の場合、ハンドラーの設定はHelloFcApp::Example.Hello::PocoHandler
です。制品
のパラメータハンドラーへの入力。The input to the handler. この例の入力タイプは
Product Class
です。 POCOが特定のJSONシリアル化オブジェクトを指定していない場合、Function ComputeはJSON.Netを使用してオブジェクトを逆シリアル化します。(オプション) IFcContext contextパラメーター
関数とリクエストに関する情報を含むコンテキストオブジェクト。
プロダクト
応答戻り値は
POCO Product
型です。 POCOが特定のJSONシリアル化オブジェクトを指定していない場合、Function ComputeはJSON.Netを使用してオブジェクトをシリアル化します。
カスタムシリアライザー
デフォルトでは、Function Computeはに基づくシリアル化インターフェイスを提供します。JSONを使用します。NET. デフォルトのシリアル化インターフェイスがビジネス要件を満たさない場合は、Aliyun.Serverless.Core
のインターフェイスIFcSerializer
に基づいてカスタムシリアル化インターフェイスを実装できます。
public interface IFcSerializer
{
T Deserialize<T>(Stream requestStream);
void Serialize<T>(T response, Stream responseStream);
}
サンプルプログラム
Function Computeの公式ライブラリには、さまざまなハンドラータイプとインターフェイスを使用するサンプルプログラムが含まれています。 各サンプルプログラムには、簡単なコンパイルと展開のためのメソッドが含まれます。
dotnet3-blank-stream-event: ストリーム形式のイベントコールバックを使用します。
dotnet3-blank-pocoイベント: POCO形式のイベントコールバックを使用します。