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

Function Compute:ハンドラー

最終更新日:Aug 28, 2024

C# ハンドラーを使用して、受信したイベントに応答し、対応するビジネスロジックを実行できます。 このトピックでは、C# ハンドラーの概念と機能について説明し、例を示します。

説明

HTTPトリガーまたはカスタムドメイン名を使用して関数にアクセスする場合は、HTTP応答を定義する前にリクエスト構造体を取得してください。 詳細については、「HTTPトリガーを使用した関数の呼び出し」をご参照ください。

ハンドラーとは何ですか?

Function Computeの関数のハンドラーは、関数コードでリクエストを処理するために使用されるメソッドです。 関数が呼び出されると、Function Computeは設定したハンドラーを使用してリクエストを処理します。

function Computeコンソールで関数を作成または更新するときに、関数のハンドラーを設定できます。 詳細については、「イベント関数の作成」をご参照ください。

Function ComputeのC# 関数のハンドラーは、Assembly::Namespace.ClassName::MethodName形式に従います。

パラメーター

説明

アセンブリ

作成されたアセンブリの名前。

名前空間

名前空間の名前。

クラス名

クラスの名前。

MethodName

メソッドの名前。The name of the method.

たとえば、アセンブリの名前がHelloFcAppの場合、ハンドラーはHelloFcApp:: example. HelloFC::StreamHandlerです。 サンプルコード:

System.IOを使用した

using System.IO;

namespace Example
{
    public class HelloFC
  {
      public async Task<Stream> StreamHandler(Stream input)
    {
        //function logic
    }
  }
}

ハンドラーの設定は、Function Computeの設定仕様に準拠している必要があります。 設定の仕様は、ハンドラーの種類によって異なります。

Handlerインターフェイス

C# 関数を作成するときは、関数が呼び出されたときに実行されるハンドラーメソッドを指定する必要があります。 このハンドラメソッドは、静的メソッドまたはインスタンスメソッドのいずれかです。 ハンドラーメソッドでIFcContextオブジェクトにアクセスする場合は、メソッドの2番目のパラメーターをIFcContextオブジェクトとして指定する必要があります。 次のコードスニペットは、イベント関数でサポートされているハンドラーメソッドの定義を示しています。

ReturnType HandlerName(InputType input, IFcContext context);  //IFcContext contained 
ReturnType HandlerName(InputType input); //IFcContext not contained 
Async Task<ReturnType> HandlerName(InputType input, IFcContext context);
Async Task<ReturnType> HandlerName(InputType input);

Function Computeは、C# 関数のAsyncをサポートしています。 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

次の例では、単純なストリームハンドラーのサンプルコードを示します。

System.IOを使用した

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パラメーター

    関数とリクエストに関する情報を含むコンテキストオブジェクト。

  • タスク <Stream> の応答

    戻り値。Stream型です。

POCOハンドラー

次の例では、単純なPOCOハンドラーのサンプルコードを示します。

Aliyun.Serverless.Core; を使用した

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です。

  • 制品のパラメータ

    ハンドラーの入力。 この例の入力タイプはProduct Classです。 POCOが特定のJSONシリアル化オブジェクトを指定していない場合、Function ComputeはJSON.Netを使用してオブジェクトのJSON逆シリアル化を実行します。

  • (オプション) IFcContext contextパラメーター

    関数とリクエストに関する情報を含むコンテキストオブジェクト。

  • プロダクト応答

    戻り値はPOCO Product型です。 POCOが特定のJSONシリアル化オブジェクトを指定していない場合、Function ComputeはJSON.Netを使用してオブジェクトのJSONシリアル化を実行します。

カスタムシリアライザー

デフォルトでは、Function ComputeはJson.NETに基づくシリアライザーを提供します。 デフォルトのシリアライザーがビジネス要件を満たせない場合は、Aliyun.Serverless.CoreIFcSerializerに基づくカスタムシリアライザーを実装できます。

public interface IFcSerializer
{
    T Deserialize<T>(Stream requestStream);
    void Serialize<T>(T response, Stream responseStream);
}      

HTTPトリガーを使用して関数を呼び出す

サンプルコード

using System;
using System.Collections.Generic;
using System.Text;
using System.Text.Json;
using Aliyun.Serverless.Core;
using Microsoft.Extensions.Logging;

namespace Example
{
    public class Hello
    {
        public class HTTPTriggerEvent
        {
            public string Version { get; set; }
            public string RawPath { get; set; }
            public string Body { get; set; }
            public bool IsBase64Encoded { get; set; }
            public RequestContext RequestContext { get; set; }
            public Dictionary<string, string> Headers { get; set; }
            public Dictionary<string, string> QueryParameters { get; set; }

            public override string ToString()
            {
                return JsonSerializer.Serialize(this);
            }
        }

        public class RequestContext
        {
            public string AccountId { get; set; }
            public string DomainName { get; set; }
            public string DomainPrefix { get; set; }
            public string RequestId { get; set; }
            public string Time { get; set; }
            public string TimeEpoch { get; set; }
            public Dictionary<string, string> Http { get; set; }
        }

        public class HTTPTriggerResponse
        {
            public int StatusCode { get; set; }
            public Dictionary<string, string> Headers { get; set; }
            public bool IsBase64Encoded { get; set; }
            public string Body { get; set; }
        }

        public HTTPTriggerResponse PocoHandler(HTTPTriggerEvent input, IFcContext context)
        {
            context.Logger.LogInformation("receive event: {0}", input.ToString());
            string requestBody = input.Body;
            if (input.IsBase64Encoded)
            {
                byte[] decodedBytes = Convert.FromBase64String(input.Body);
                requestBody = Encoding.UTF8.GetString(decodedBytes);
            }
            return new HTTPTriggerResponse
            {
                StatusCode = 200,
                IsBase64Encoded = false,
                Body = requestBody
                };
        }
        static void Main(string[] args){}
    }
}

あなたが始める前に

上記の例を使用して、C# ランタイムで関数を作成しました。 詳細については、「イベント関数の作成」および「HTTPリクエストで関数を呼び出すHTTPトリガーの設定」をご参照ください。

手順

  1. Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。

  3. 関数の詳細ページで、[トリガー] タブをクリックして、HTTPトリガーのパブリックエンドポイントを取得します。

  4. curlで次のコマンドを実行して、関数を呼び出します。

    curl -i "https://test-python-ipgrwr****.cn-shanghai.fcapp.run" -d 'Hello fc3.0'

    上記のコマンドでは、https:// test-python-ipgrwr **** .cn-shanghai.fcapp.ru nがHTTPトリガーの取得されたパブリックエンドポイントです。

    重要
    • HTTPトリガーの [認証方法] パラメーターが [認証なし] に設定されている場合、Postmanまたはcurlを使用して関数を呼び出すことができます。 詳細については、「手順」をご参照ください。

    • HTTPトリガーの [認証方法] パラメーターが [署名認証] または [JWT認証] に設定されている場合、署名方法またはJWT認証方法を使用して関数を呼び出すことができます。 詳細については、「認証」をご参照ください。

    次の応答が返されます。

    HTTP/1.1 200 OK
    Content-Disposition: attachment
    Content-Length: 12
    Content-Type: application/json
    X-Fc-Request-Id: 1-64f7449a-127fbe39cd7681596e33ebad
    Date: Tue, 05 Sep 2023 15:09:14 GMT
    
    Hello fc3.0

考えられるエラー

このサンプルコードは、HTTPトリガーまたはカスタムドメイン名を使用して呼び出すことができます。 API操作を使用しているが、設定されたテストパラメーターがHTTPトリガーの要求形式要件に準拠していない場合、エラーが報告されます。

たとえば、リクエストパラメーターを "Hello, FC!" として設定した後、function Computeコンソールで [Test Function] をクリックして関数を呼び出すと、次のレスポンスが返されます。

{
    "errorMessage": "Unexpected character encountered while parsing value: H. Path '', line 0, position 0.",
    "errorType": "Newtonsoft.Json.JsonReaderException",
    "stackTrace": [
        "   at Newtonsoft.Json.JsonTextReader.ParseValue()",
        "   at Newtonsoft.Json.JsonReader.ReadAndMoveToContent()",
        "   at Newtonsoft.Json.JsonReader.ReadForType(JsonContract contract, Boolean hasConverter)",
        "   at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize(JsonReader reader, Type objectType, Boolean checkAdditionalContent)",
        "   at Newtonsoft.Json.JsonSerializer.DeserializeInternal(JsonReader reader, Type objectType)",
        "   at Newtonsoft.Json.JsonSerializer.Deserialize(JsonReader reader, Type objectType)",
        "   at Newtonsoft.Json.JsonSerializer.Deserialize[T](JsonReader reader)",
        "   at Aliyun.Serverless.Core.JsonSerializer.Deserialize[T](Stream requestStream) in /dotnetcore/Libraries/src/Aliyun.Serverless.Core.Impl/JsonSerializer.cs:line 95"
    ]
}

サンプルプログラム

Function Computeの公式ライブラリには、さまざまなハンドラータイプとインターフェイスを使用するサンプルプログラムが含まれています。 各サンプルプログラムには、簡単なコンパイルと展開のためのメソッドが含まれます。