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.Core
のIFcSerializer
に基づくカスタムシリアライザーを実装できます。
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トリガーの設定」をご参照ください。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [関数] ページで、管理する関数をクリックします。
関数の詳細ページで、[トリガー] タブをクリックして、HTTPトリガーのパブリックエンドポイントを取得します。
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/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の公式ライブラリには、さまざまなハンドラータイプとインターフェイスを使用するサンプルプログラムが含まれています。 各サンプルプログラムには、簡単なコンパイルと展開のためのメソッドが含まれます。
dotnet3-blank-stream-event: ストリーム形式のイベントコールバックを使用します。
dotnet3-blank-pocoイベント: POCO形式のイベントコールバックを使用します。