shuhelohelo’s blog

Xamarin.Forms多めです.

SignalRでプロパティを持つオブジェクトを渡す. WPF ⇔ Server

環境

前回までは単純なstring型をサーバーとクライアント間でやりとりしていました.

shuhelohelo.hatenablog.com

当然そのような基本型だけでなく,以下のようなプロパティを持つオブジェクトのやりとりもできます.

    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でオブジェクトを渡してみようと思います.

今回の分.

github.com