すべてのプロダクト
Search
ドキュメントセンター

Function Compute:イベントハンドラー

最終更新日:Sep 02, 2024

このトピックでは、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は返されるオブジェクトです。voidSystem.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の公式ライブラリには、さまざまなハンドラータイプとインターフェイスを使用するサンプルプログラムが含まれています。 各サンプルプログラムには、簡単なコンパイルと展開のためのメソッドが含まれます。