SignalRでプロパティを持つオブジェクトを渡す. WPF ⇔ Server
環境
- Windows 10 pro 1906
- Visual Studio 2019 16.4 preview1
- dotnet core 3.0.100
前回までは単純なstring型をサーバーとクライアント間でやりとりしていました.
当然そのような基本型だけでなく,以下のようなプロパティを持つオブジェクトのやりとりもできます.
public class Message { public string SenderName { get; set; } public string Body { get; set; } public DateTimeOffset SendDateTime { get; set; } }
送り主の名前,本文,送信時刻というプロパティを持つシンプルなオブジェクトです.
クライアント側もサーバー側も,送受信に関してはこれまでと変わりません.
ただ,今まで引数の型や型引数でstring
を指定していたところにMessage
型を指定すればよいだけです.
具体的には以下のようになります.
サーバー側:
public async Task SendObject(Message message) { await Clients.All.SendAsync("ReceiveObject", message); }
クライアント側:
//受信部分 _connection.On<Message>("ReceiveObject", (message) => { this.Dispatcher.Invoke(()=> { messagesList.Items.Add($"{message.Body}_{message.SenderName}_{message.SendDateTime.ToString()}"); }); });
//送信部分 //送信するオブジェクトを作成 var message = new Message { SenderName = "WPF", Body = messageTextBox.Text, SendDateTime = DateTimeOffset.Now, }; //送信 try { await _connection.InvokeAsync("SendObject",message); } catch(Exception ex) { this.Dispatcher.Invoke(()=> { messagesList.Items.Add(ex.Message); }); }
さて,このMessageクラスですが,サーバーとクライアントの双方が同じものを使用する必要があるので,クラスライブラリとして作成し,それをサーバー,クライアントの双方で参照に追加しています.
今回のようにクライアントとサーバーがどちらもC#で実装されていると,こういったところがとても便利ですね.
しかしながら,Webアプリケーションだとクライアント側はJavascriptをはじめとしたC#以外の言語が使用されることがほとんどです.(でもBlazorならC#C#!)
次はJavascript ⇔ Serverでオブジェクトを渡してみようと思います.
今回の分.