Azure Functions における SignalR Service のトリガー バインド

SignalR トリガー バインドを使用して、Azure SignalR Service から送信されたメッセージに応答します。 関数がトリガーされると、関数に渡されるメッセージは JSON オブジェクトとして解析されます。

SignalR Service サーバーレス モードでは、SignalR Service はアップストリーム機能を使用して、クライアントから関数アプリにメッセージを送信します。 また関数アプリでは、SignalR Service トリガー バインドを使用してこれらのメッセージを処理します。 一般的なアーキテクチャを次に示します。 SignalR トリガーのアーキテクチャ

セットアップと構成の詳細については、概要に関する記事を参照してください。

次の例は、トリガー バインドを使用してメッセージを受信し、メッセージをログに記録する関数を示しています。

C# 用 SignalR Service トリガー バインドには、2 つのプログラミング モデルがあります。 クラス ベースのモデルと従来のモデルです。 クラス ベースのモデルは、一貫性のある SignalR サーバー側プログラミング エクスペリエンスを提供します。 従来のモデルは柔軟性がより高く、他の関数バインドと似ています。

クラス ベースのモデルの使用

詳細については、クラス ベースのモデルを参照してください。

public class SignalRTestHub : ServerlessHub
{
    [FunctionName("SignalRTest")]
    public async Task SendMessage([SignalRTrigger]InvocationContext invocationContext, string message, ILogger logger)
    {
        logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
    }
}

従来のモデルの使用

従来のモデルは、C# で開発された Azure 関数の規則に従います。 これに慣れていない場合は、ドキュメントを参照してください。

[FunctionName("SignalRTest")]
public static async Task Run([SignalRTrigger("SignalRTest", "messages", "SendMessage", parameterNames: new string[] {"message"})]InvocationContext invocationContext, string message, ILogger logger)
{
    logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
}

属性 [SignalRParameter] を使用した ParameterNames の簡略化

ParameterNames の使用は少し面倒であるため、同じ目的を達成するために SignalRParameter が提供されています。

[FunctionName("SignalRTest")]
public static async Task Run([SignalRTrigger("SignalRTest", "messages", "SendMessage")]InvocationContext invocationContext, [SignalRParameter]string message, ILogger logger)
{
    logger.LogInformation($"Receive {message} from {invocationContext.ConnectionId}.");
}

構成

SignalRTrigger

次の表は、function.json ファイルと SignalRTrigger 属性で設定したバインド構成のプロパティを説明しています。

function.json のプロパティ 属性のプロパティ 説明
type 該当なし SignalRTrigger に設定する必要があります。
direction 該当なし in に設定する必要があります。
name 該当なし トリガー呼び出しコンテキスト オブジェクトの関数コードで使用される変数名。
hubName HubName この値は、トリガーされる関数の SignalR ハブの名前に設定する必要があります。
category カテゴリ この値は、トリガーされる関数のメッセージのCategoryとして設定する必要があります。 カテゴリには次のいずれかの値を指定することができます。
  • connections:connected および disconnected イベントを含む
  • messages:connections カテゴリ以外の他のすべてのイベントを含む
event Event この値は、トリガーされる関数のメッセージのイベントとして設定する必要があります。 messages カテゴリの場合、イベントは「呼び出しメッセージ」でクライアントが送信する target です。 connections カテゴリの場合、connected および disconnected のみが使用されます。
parameterNames ParameterNames (省略可能) パラメーターにバインドする名前のリスト。
connectionStringSetting ConnectionStringSetting SignalR Service 接続文字列を含むアプリ設定の名前 (既定値は "AzureSignalRConnectionString")

ペイロード

トリガーの入力型は、InvocationContext またはカスタム型のいずれかとして宣言されています。 InvocationContext を選択した場合は、要求のコンテンツへのフル アクセスが取得されます。 カスタム型 の場合、ランタイムは JSON 要求本文を解析して、オブジェクトのプロパティを設定しようとします。

InvocationContext

InvocationContext には、SignalR サービスから送信されるメッセージのすべてのコンテンツが含まれています。

InvocationContext のプロパティ 説明
引数 messages カテゴリで使用可能。 「呼び出しメッセージ」の arguments が格納されています
エラー disconnected イベントで使用可能。 接続がエラーなしで閉じられた場合、またはエラー メッセージが含まれている場合は、空になる場合があります。
ハブ メッセージが属しているハブの名前。
カテゴリ メッセージのカテゴリ。
Event メッセージのイベント。
ConnectionId メッセージを送信するクライアントの接続 ID。
UserId メッセージを送信するクライアントのユーザー ID。
ヘッダー 要求のヘッダー。
クエリ クライアントがサービスに接続するときの要求のクエリ。
Claims クライアントのクレーム。

ParameterNames の使用

SignalRTrigger のプロパティ ParameterNames を使用すると、呼び出しメッセージの引数を関数のパラメーターにバインドできます。 定義した名前は、他のバインドのバインド式の一部として、またはコードのパラメーターとして使用できます。 これにより、InvocationContext の引数へのアクセスがより便利になります。

たとえば、JavaScript SignalR クライアントが 2 つの引数 (message1message2) を使用して Azure 関数でメソッド broadcast を呼び出そうとしているとします。

await connection.invoke("broadcast", message1, message2);

parameterNames を設定すると、定義した名前が、クライアント側で送信される引数それぞれに対応します。

[SignalRTrigger(parameterNames: new string[] {"arg1, arg2"})]

この場合、arg1message1 のコンテンツが含まれ、arg2message2 のコンテンツが含まれます。

解説

パラメーター バインドの場合、順序は重要です。 ParameterNames を使用している場合、ParameterNames の順序は、クライアントで呼び出した引数の順序と一致します。 C# で属性 [SignalRParameter] を使用している場合、Azure 関数メソッドの引数の順序は、クライアントの引数の順序と一致します。

ParameterNames および属性 [SignalRParameter] を同時に使用することは できません。使用すると、例外が発生します。

SignalR Service の統合

SignalR Service トリガー バインドを使用している場合、SignalR サービスには関数アプリにアクセスするための URL が必要です。 URL は、SignalR Service 側の アップストリームの設定 で構成する必要があります。

アップストリーム ポータル

SignalR Service トリガーを使用する場合、URL は単純で、次に示す形式にすることができます。

<Function_App_URL>/runtime/webhooks/signalr?code=<API_KEY>

Function_App_URL は関数アプリの [概要] ページで確認でき、API_KEY は Azure 関数によって生成されます。 関数アプリの [アプリ キー] ブレードで signalr_extension から API_KEY を取得できます。 API キー

1 つの SignalR サービスで複数の関数アプリを一緒に使用する場合は、アップストリームで複雑なルーティング規則をサポートすることもできます。 詳細については「アップストリームの設定」をご覧ください。

ステップ バイ ステップ サンプル

GitHub のサンプルに従って、SignalR Service トリガー バインドとアップストリーム機能を使用して関数アプリに関するチャット ルームをデプロイできます。双方向チャット ルームのサンプル

次のステップ