「[[マイクロソフト系技術情報 Wiki>http://techinfoofmicrosofttech.osscons.jp/]]」は、「[[Open棟梁Project>https://github.com/OpenTouryoProject/]]」,「[[OSSコンソーシアム .NET開発基盤部会>https://www.osscons.jp/dotNetDevelopmentInfrastructure/]]」によって運営されています。 -[[戻る>OWIN]] * 目次 [#c8bacd1e] #contents *概要 [#ie5a2a4e] -ASP.NETに[[リアルタイム・ウェブ>WebSocket#d7dbcac1]]機能を追加するためのライブラリ -WebSocketに依存しないので、WebSocketの新規採用の可能性が低くなった以降も可能性はある技術と言える。 *仕組み [#hba6308a] **下位トランスポート [#zd1c108f] 下位トランスポートには、 -[[WebSocket>#z777146e]] -[[WebSocket以外>#u3d3cded]] がある。 **API [#u240a58d] SignalRには、[[PersistentConnection>#f06129de]]と[[Hub>#n080d9a3]]という2つのAPIが存在する。 ***PersistentConnection [#f06129de] -サーバとクライアントの間での「持続的な接続」を提供する。 -[[下位トランスポート>#zd1c108f]]の上位に実装されている。 -1つのメッセージを送受信する機能しかない。 -[[クライアントを管理するための機能>#g612a5a3]]も用意されている。 ***Hub [#n080d9a3] -SignalRを使ったアプリの開発では主にHubを使う。 -[[PersistentConnection>#f06129de]]の上位に実装されている(RPC的な高レベルAPI)。 --クライアント/サーバ間のメソッド呼び出しという基本的な機能を提供している。 --[[ASP.NET MVCのアクション・フィルタ>ASP.NET MVCの用語#w535e86f]]に相当する「[[HubPipeline>#yf3120b4]]」と呼ばれる機能が実装されている。 ---これを利用してクライアントの認証が実装されている。 ---認証目的以外にも開発者が自由に拡張できる。 --オーバーヘッドが大きい。 ---リクエストの解析 ---リフレクションを使ったメソッド呼び出し **Connection ID [#g612a5a3] ***Context [#j9d9f621] -Contextプロパティ --HttpContextなどの振る舞いは、[[下位トランスポート>#zd1c108f]]によって異なるので使用しない。 --例えば、WebSocketが[[下位トランスポート>#zd1c108f]]の場合、HttpContextは、接続時の情報に固定される。 -Hub.Contextプロパティ --HubCallerContextクラスのインスタンスがHub.Contextプロパティとして公開される。 -- |#|プロパティ|説明|h ||Context.ConnectionIdプロパティ|クライアントのコネクションID| ||Context.Headersプロパティ|HTTPリクエスト・ヘッダーのコレクション| ||Context.QueryStringプロパティ|クエリ文字列のコレクション| ||Context.Requestプロパティ|今回のリクエスト情報| ||Context.RequestCookiesプロパティ|クッキーのコレクション| ||Context.Userプロパティ|ログイン中のユーザー情報| ***Groupsプロパティ [#lfd90be0] グループ管理を行う。 |#|メソッド|説明|h |1|Groups.Addメソッド|全てのクライアント| |2|Groups.Removeメソッド|自分のみのクライアント| ***Clientsプロパティ [#de4cad54] -全て、自分、自分以外のクライアントへのメッセージ送信 |#|プロパティのメソッド|説明|h |1|Clients.Allプロパティのメソッド|全てのクライアント| |2|Clients.Callerプロパティのメソッド|自分のみのクライアント| |3|Clients.Othersプロパティのメソッド|自分以外の全てのクライアント| -グループのクライアントへのメッセージ送信 |#|プロパティのメソッド|説明|h |1|Clients.Group(string groupName)のメソッド|指定したグループ名に属するクライアント| **HubPipeline [#yf3120b4] SignalRのバージョン1.0から「HubPipeline」と呼ばれる仕組みが追加された。 ***概要 [#i588a8a0] -ASP.NET MVCのアクション・フィルタのようにメソッドが実行の前・後で独自の処理を行える。 -実体はIHubPipelineModuleインターフェイスを実装したクラスの集合 -IHubPipelineModuleインターフェイスを実装したクラスのBeforeとAfterメソッドを実装する。 -Application_StartでGlobalHost.HubPipeline.AddModuleを使用してModuleを登録する。 ***認証 [#d8bf4400] -ASP.NET MVCやWeb APIのようにAuthorize属性を付けるだけで認証が可能 -Notifyメッセージが送信されるのは認証済みのクライアントだけとなる。 **スケールアウト [#ced4ca9b] -スケールアウトの際は、メッセージング・サーバを用意する必要がある。 -SignalR 1.1からはスケールアウトに必要な機能が内部的に共通化された。 ***Redis [#k5ec9908] -KVS(Key-Valueストア) -他のKVSに無いPub/Sub型のメッセージング・システムを持っている。 ***Windows Azureサービス・バス [#w6954c88] -サーバを用意する必要がないので簡単に開始できる。 -メッセージ量が増えるとスケールしなくなる。 ***SQL Server [#g19a531c] -「クエリ通知」という機構を利用している。 -AzureのSQLデータベースでは実行できない。 *開発 [#w81b50fa] **サーバ [#w1ab30e7] ***処理順 [#u181436b] -テンプレートを選択 -NuGetを使ってSignalRをインストール -Global.asax.csファイルのApplication_Startで設定 --Hubクラスのルーティングを設定する。 --必要に応じて[[スケールアウト>#ced4ca9b]]に関する設定を行う。 GlobalHost.DependencyResolver.XXXX(config); --必要に応じて[[HubPipeline]]を追加する設定する。 GlobalHost.HubPipeline.AddModule(new XXXXHubPipeline()) -通例的にHubsディレクトリを作成 -Hubクラスを作成(なるべくHubName属性を付与) -Hubクラスのメソッドに、Clientsのプロパティを使用してレスポンス処理を書く。 ***サーバ・ライブラリ [#z9f689c7] -基本 --NuGet Gallery | Microsoft.AspNet.SignalR.Redis~ https://www.nuget.org/packages/Microsoft.AspNet.SignalR/ -[[スケールアウト>#ced4ca9b]] --NuGet Gallery | Microsoft.AspNet.SignalR.Redis~ https://www.nuget.org/packages/Microsoft.AspNet.SignalR.Redis/ Install-Package Microsoft.AspNet.SignalR.Redis ---BookSleeveというRedisクライアント・ライブラリを利用 --NuGet Gallery | Microsoft.AspNet.SignalR.ServiceBus~ https://www.nuget.org/packages/Microsoft.AspNet.SignalR.Redis/ Install-Package Microsoft.AspNet.SignalR.ServiceBus --NuGet Gallery | Microsoft.AspNet.SignalR.SqlServer~ https://www.nuget.org/packages/Microsoft.AspNet.SignalR.SqlServer/ Install-Package Microsoft.AspNet.SignalR.SqlServer **クライアント [#qebcfbc8] ***処理順 [#v020ad82] -サーバとの接続オブジェクトを作成 -Hubのプロキシ・オブジェクトを作成 -クライアントのメソッド(コールバック)を登録 -接続を開始 -サーバのメソッドを呼出 ***クライアント・ライブラリ [#t45a798d] -JavaScript~ https://www.nuget.org/packages/Microsoft.AspNet.SignalR.JS/ -.NET用~ https://www.nuget.org/packages/Microsoft.AspNet.SignalR.Client/ -, etc.~ SignalR-ObjCなどもある。 *WebSocket [#z777146e] **[[概要>WebSocket]] [#t43e2e33] **利用方法 [#j222c864] -Windows Server 2012から搭載されたIIS 8と.NET Framework 4.5が必要。 -サーバ並びにブラウザ共にWebSocketをサポートしていた場合に有効になる。 -WebSocketがサポートされない場合、[[WebSocket以外の選択肢>#u3d3cded]]を用いてリアルタイム通信を実現する。 **WebSocket以外 [#u3d3cded] サーバの要件とブラウザ側の対応状況に基づいて、~ [[選択肢>#pd3703cf]]の中から最適な通信手段をSignalRが選択する。 ***選択肢 [#pd3703cf] -Ajax ロングポーリング(Long-polling) -iframe -Comet (Ajax Long-polling) -Server-Sent Events ***参考 [#ic48d18c] 詳しくは、[[コチラ>WebSocket#v5e26cae]]を参照。 *参考 [#cc76e278] -SignalR | The ASP.NET Site~ https://www.asp.net/signalr -ASP.NET SignalR~ http://signalr.net -特集:最新技術を活用したWebアプリとは? - Build Insider~ https://www.buildinsider.net/web/signalrko -SignalR カテゴリーの記事一覧 - しばやん雑記~ http://blog.shibayan.jp/archive/category/SignalR -SignalR カテゴリーの記事一覧 - かずきのBlog@hatena~ http://blog.okazuki.jp/archive/category/SignalR -「SignalR」の検索結果 - Qiita~ https://qiita.com/search?page=2&q=SignalR -ASP.NET MVC 5 アプリにSignalRの機能を足す方法 - 銀の光と碧い空~ http://tech.tanaka733.net/entry/2014/10/06/ASP.NET_MVC_5_%E3%82%A2%E3%83%97%E3%83%AA%E3%81%ABSignalR%E3%81%AE%E6%A9%9F%E8%83%BD%E3%82%92%E8%B6%B3%E3%81%99%E6%96%B9%E6%B3%95 **Wikipedia [#jc55b567] -WebSocket~ https://ja.wikipedia.org/wiki/WebSocket -Microsoft ASP.NET SignalR~ https://ja.wikipedia.org/wiki/Microsoft_ASP.NET_SignalR **Qiita [#h7b1b350] -SignalRによる双方向通信~ https://qiita.com/mash0510/items/a36f4d341edc50064d90 -ASP.NET Coreでリアルタイムで接続するWebアプリケーション作ってみた~ https://qiita.com/s_saito/items/39cfe82b0985a1bd10dc **@IT [#c40a75d4] -特集:ASP.NET SignalR入門~ http://www.atmarkit.co.jp/ait/series/1048/ --ASP.NET SignalRを知る~ http://www.atmarkit.co.jp/ait/articles/1303/19/news099.html --ASP.NET SignalRの高度な機能~ http://www.atmarkit.co.jp/ait/articles/1307/08/news110.html **Microsoft Docs [#h166fac6] -SignalR~ https://docs.microsoft.com/ja-jp/aspnet/signalr/ --SignalR の概要~ https://docs.microsoft.com/ja-jp/aspnet/signalr/overview/getting-started/introduction-to-signalr ---- Tags: [[:.NET開発]], [[:OWIN]], [[:ASP.NET]], [[:ASP.NET SignalR]]