はじめに
ASP.NET Core SignalRを使った際に、扱うデータをオブジェクトでいい感じに管理したかったので方法を調べました。
JSONをstringifyしてもできますが、オブジェクトとして扱うことで型を厳密に管理したり入力補完を効かせたりできるので、扱うデータはオブジェクトとして管理したほうが良いです。
ドキュメントはこちらです。
docs.microsoft.com
カスタムオブジェクトを作る
IDと名前を扱うシンプルなオブジェクトを作ります。
public class JoinUserRequest { public string ID { get; set; } public string Name { get; set; } }
リクエストをカスタムオブジェクトとして受け取る
リクエストをカスタムオブジェクトとして受け取るコードはこちらです。
public async Task JoinUser(JoinUserRequest req) { Console.WriteLine(req.ID); Console.WriteLine(req.Name); }
JavaScript側からデータを送る際は以下のようなコードで実現できます。
connection.invoke('JoinUser', { ID: 'foo', Name: 'bar' });
データをオブジェクトとして送信する
サーバー側からクライアントに向けてオブジェクトとしてデータを送る際は以下のコードで送信できます。
await Clients.Caller.SendAsync("Joined", new { Succeeded = true, Message = "Joined" });
送信時は受信時のようにあらかじめクラスを宣言せずにオブジェクトを送ることができます。
JavaScript側では以下のようにオブジェクトとして受け取ることができます。
connection.on('Joined', res => { if (res.succeeded) { console.log(res.message); } else { console.error(res.message); } });