ごった煮

色々な事を書いてます

SignalRのご紹介

みなさんASp.NET SignalR(以下SignalR)というライブラリをご存知でしょうか. SignalRとは, One ASP.NETの柱の一つとして, WebAPIと同列のサービスに位置づけられているものであり, ASP.NETにリアルタイムウェブの技術を導入するためのライブラリです.

リアルタイムウェブ

リアルタイムウェブといえば, WebSocket, ServerSentEvents, ForeverFrame, Long-pollingなどの技術を使用して, リアルタイムにデータのやり取りを行うものですが, 今までの実装方法では, これらの通信方式を使用して通信を行う場合, 環境によって使えるものと使えないものがあるため, それぞれをうまく実装していかないとならないなど, かなり面倒な問題がありました. 実際, Long-pollingは, かなり古い技術でありほぼすべての環境で使えるはずですが流石に技術的に古すぎるため, 色々問題もあり, あまり推奨できるものではありません.

SignalR

そこで, SignalRの出番です. SignalRは, これらの通信方式を包括的に扱い, 接続されている環境に合わせて通信方式を自動的に切り替え, どのような環境でもリアルタイムウェブを導入することができます. 例えば, WebSocketが実装されていないブラウザや, HTML5が実装されていないためにServerSentEventsが使えない場合や, ファイアーウォールなどでWebScoketが使えないなど様々な環境がありますが, それぞれの環境に対しての最適解を提供することができます.

また, SignalRは, サーバサイドをASP.NETで実装すれば, クライアントサイドは, JS, .NET, Obj-Cなど, 幅広い言語で実装できるため, かなりの環境で使用することが可能です.

それに加え, かなり実装が楽であるため, すぐにリアルタイムウェブの実装が可能です.

サーバの実装

サーバサイドの実装は, 以下のようになります. [csharp] [HubName("Hub")] public class Hubs : Hub { public void Hello() { Clients.All.hello(); } } [/csharp]

[csharp] [assembly: OwinStartup(typeof(SignalRServer.Startup))] namespace SignalRServer { public class Startup { public void Configuration(IAppBuilder app) { app.MapSignalR(); } } } [/csharp]

これだけの実装で, SignalRのサーバ側の基礎的な実装は完了です. これをサーバにホストし, ホスト名/signalrにクライアントから接続すると, それだけでSignalRを使用して通信が行えます.

このプログラムでは, HubクラスのHello()メソッドがクライアントから呼び出されると, Hubに接続しているすべてのクライアントのhello()メソッドが呼び出されるという動作をします.

従来の方式では, そもそもコネクションから通信までが結構面倒でありましたが, SignalRを使用すれば, そのようなハードルも一気に下げることができるため, サービスの内容に幅を持たせることができるようになるのではないでしょうか.