none
C#でWebSocketを使用した開発(System.Web.WebSocketsとSignalRの違い) RRS feed

  • 質問

  • C#でWebSocketを使用した開発を検討しています。
    UIの更新を自動化するのが目的です。

    WebSocketの開発には、.NET4.5から追加されたSystem.Web.WebSocketsやSignalRなどを使用する方法があるようですが、Windows Server 2012 R2以降のサーバーとIE/FireFox/Chrome最新版のクライアントでWebSocketを使用する場合には、何を使用するのがいいのでしょうか?

    以前はSignalRの投稿が多く見られましたが、最近は見られないため、System.Web.WebSocketsを使用するのがいいのでしょうか?

    また、System.Web.WebSocketsとSignalRでメリット・デメリットがあるようでしたら教えていただけないでしょうか?

    2016年8月5日 0:58

回答

  • SignalRはWebSocketsも含めた複数のプロコトルを利用できる、双方向通信のためのフレームワークです。

    双方向通信は現在WebSocketsが広く使われているようですが、他にもいくつか実現できるプロトコルがあります。比較的新しいブラウザであればWebSocketsが利用可能だと思いますが、古いブラウザだと利用できないこともあります。SignalRを使うと、WebSocketsが利用できない場合に他のプロコトルに切り換えるといったことができます。SignalRはWebSocketを含んだレイヤーの一つ上のレイヤーにあるフレームワークといえると思います。

    ですので、WebSocketsしか使わないという方針であれば、SignalRを使わずに直接WebSocketsを利用することができます。しかし、プロコトルを切り換える機能の他に、SignalRではRPCスタイルのAPIを採用しているため、クライアントからサーバー側に通信するときの実装が記述しやすいというメリットがあります。他にも今回の要件では使うべきかどうかは難しいですが、クライアントとサーバーの両方でAPIの型付けを行えたり、クライアントのグループ化や認証といった機能を実装するためのAPIが用意されていたり、スケールアウトがサポートされていたりする、といった点がSignalRを採用する際のメリットになるかと思います。

    SignalRの情報が最近少ないのは、新機能のリリースが見当たらなくなったせいもあるかと思います。ASP.NET CoreのroadmapにSignalRが含まれているので、おそらく新機能開発よりASP.NET Core対応を進めている現状ではないかというのが個人的な考えです。

    2016年8月7日 23:17

すべての返信

  • SignalRはWebSocketsも含めた複数のプロコトルを利用できる、双方向通信のためのフレームワークです。

    双方向通信は現在WebSocketsが広く使われているようですが、他にもいくつか実現できるプロトコルがあります。比較的新しいブラウザであればWebSocketsが利用可能だと思いますが、古いブラウザだと利用できないこともあります。SignalRを使うと、WebSocketsが利用できない場合に他のプロコトルに切り換えるといったことができます。SignalRはWebSocketを含んだレイヤーの一つ上のレイヤーにあるフレームワークといえると思います。

    ですので、WebSocketsしか使わないという方針であれば、SignalRを使わずに直接WebSocketsを利用することができます。しかし、プロコトルを切り換える機能の他に、SignalRではRPCスタイルのAPIを採用しているため、クライアントからサーバー側に通信するときの実装が記述しやすいというメリットがあります。他にも今回の要件では使うべきかどうかは難しいですが、クライアントとサーバーの両方でAPIの型付けを行えたり、クライアントのグループ化や認証といった機能を実装するためのAPIが用意されていたり、スケールアウトがサポートされていたりする、といった点がSignalRを採用する際のメリットになるかと思います。

    SignalRの情報が最近少ないのは、新機能のリリースが見当たらなくなったせいもあるかと思います。ASP.NET CoreのroadmapにSignalRが含まれているので、おそらく新機能開発よりASP.NET Core対応を進めている現状ではないかというのが個人的な考えです。

    2016年8月7日 23:17
  • 詳細な回答ありがとうございます。
    とても参考になりました。

    レイヤーが違っていて、比較する対象ではなかったんですね。

    2016年8月9日 1:52