メソッド、インターフェース定義
概要
StreamingHub は Unary サービスと同様に .NET のインターフェースを使用して定義します。StreamingHub のインターフェースは IStreamingHub<TSelf, TReceiver>
を継承する必要があります。TSelf
にはインターフェース自身、TReceiver
にはレシーバーインターフェイスを指定します。レシーバーインターフェースはサーバーからクライアントにメッセージを送信し、受信するためのインターフェースです。
以下はチャットアプリケーションの StreamingHub インターフェイスの例です。クライアントはメッセージの受信や参加、退出イベントを送るレシーバーインターフェースを持っています。
// A hub must inherit `IStreamingHub<TSelf, TReceiver>`.
public interface IChatHub : IStreamingHub<IChatHub, IChatHubReceiver>
{
ValueTask JoinAsync(string roomName, string userName);
ValueTask LeaveAsync();
ValueTask SendMessageAsync(string message);
}
public interface IChatHubReceiver
{
void OnJoin(string userName);
void OnLeave(string userName);
void OnSendMessage(string userName, string message);
}
StreamingHub が提供するメソッドを Hub メソッド と呼びます。Hub メソッドはクライアントから呼び出されるメソッドで、戻り値の型は ValueTask
, ValueTask<T>
, Task
, Task<T>
, void
のいずれかである必要があります。Unary サービスとは異なることに注意が必要です。
クライアントがメッセージを受け取る口となるレシーバーインターフェースもまたメソッドを持ちます。これらを レシーバーメソッド と呼びます。レシーバーメソッドはサーバーからメッセージを受けたときに呼び出されるメソッドです。レシーバーメソッドの戻り値は void
である必要があります。クライアント結果を使用する場合を除き、原則として void
を指定します。
シリアライズ
Unary サービスと同様にメソッドの引数及び戻り値はデフォルトで MessagePack によってシリアライズされます。そのため型が MessagePack でシリアライズできるようにマークされているか、あるいは構成されている必要があります。また、メソッドの引数は最大で15個まで許可されます。
継承
StreamingHub のインターフェースは継承できます。これは複数の Hub で共通のメソッドを持つ場合に役立ちます。
public inteface ICommonHub
{
ValueTask PingAsync();
}
public inteface IChatHub : IStreamingHub<IChatHub, IChatHubReceiver>, ICommonHub
{
ValueTask JoinAsync(string roomName, string userName);
ValueTask LeaveAsync();
ValueTask SendMessageAsync(string message);
}
高度な設定
Ignore
属性
Ignore
属性を使用することで特定のメソッドを Hub メソッドとして認識させないようにできます。
MethodId
属性
MethodId
属性を使用することでメソッドの識別に使用する ID を手動で指定できます。Hub メソッドの ID はメソッド名から FNV1A32 で計算された値を使用するため手動で設定する必要はありません。メソッド名を変更したが元の ID を使用したい、何らかの理由で ID が衝突してしまったといった特殊な用途でのみ使用してください。