プッシュベースのソリューションに応じて、より便利なウェブの相互作用を提供するために、SignalR。それは、後にクライアントが直接メソッドサーバを呼び出して、値を返す達成できると(クライアントは、さまざまなプラットフォームすることができ、現在SignalRは言語をサポートC#、Javaのは、JavaScript、nodejs、などを持っている)、また、サーバはクライアントを呼び出すことができます本来の目的を達成するための方法は、この方法を介して二重パスを単一通過なります。
そこには、以前の対応MVCアーキテクチャを取得する場合SignalRで非常に重要な概念は、ハブ、ハブコントローラは、それらの間の違いは、ハブ自身のルートを登録する必要があるということですされており、コントローラは、合意に基づいていますA。
最初のハブを作成
パブリッククラスNewsPushHub:ハブ { }
これは、ニュースフィードのハブが、それはまた、一般的な実装を受け取ることができるハブ、ハブの基底クラスには、この基本クラスを継承する必要があり、クライアントの指定方法は、この一般的に使用することができます
NewsPushHubクラスのパブリック:ハブ<IClientFuncs> { /// <概要> メソッドを呼び出すことができる///クライアント /// </要約> /// <PARAM NAME = "MSG"> </ param>の /// <戻り値> </戻り> 公共のタスクDepartmentNotice非同期(文字列MSG) { //この伝送方式のみ制約をインターフェースすることができる ザはClients.All.SendMsg(MSG)を待つ; } } /// <まとめ> ///定義しますクライアントリスニングプロセス名 /// </要約> パブリックインターフェイスIClientFuncs { タスクSENDMSG(文字列MSG); }
そここれは、クライアントを呼び出す直接書き込むことができる2つの方法がありますが、我々Core3.0は(ハブ=> hub.MapHub <NewsPushHub>(「/ SignalR app.UseSignalRである前にコールする前に、最初に登録します今すぐ起動このようなコードを入力し、この拡張を登録する全てapp.UseEndpointsで統一()メソッドを変更SignalRアクセス経路を登録する/ニュース「))
パブリッククラススタートアップ { ます。public void ConfigureServices(IServiceCollectionサービス) { services.AddControllersWithViews(); services.AddSignalR(); } 公共ボイド設定(IApplicationBuilderアプリ、IWebHostEnvironmentのENV) { IF(env.IsDevelopment()) { app.UseDeveloperExceptionPage()。 } app.UseRouting()。 app.UseEndpoints(エンドポイント=> { endpoints.MapHub <NewsPushHub>( "/ SignalR /ニュース")。 endpoints.MapControllerRoute( "デフォルト"、 "{コントローラ=ホーム} / {アクション=ランキング} / {ID}?"); }); }
これは、このIにおいては、経路が内部この方法UseEndpoints、()内の統一されたセットになるMVCは、MVC 3.0ミドルウェアと依存性注入は、より具体的になるように変更されている、ミドルウェア及び依存性注入を含む構成しましたデリゲートはIEndpointRouteBuilderパラメータである、我々はルーティング設定によって様々なパラメータをマッピングすることができ、目的はMVCとSignalRの相互作用を設定することですマップの多くは、あります。以下では、JSコードASPNET-signalrをインストールするには、クライアントの最初の必要性であります
//一致するHTTP作成:5000 / SignalRNews配線接続:ローカルホスト のconst接続=新しい新signalR.HubConnectionBuilder() .withUrl( "/ SignalRNews")を .configureLogging(signalR.LogLevel.Information) .build(); //接続を開始この時間は、状態101、保留中の接続を送信します ({関数()connection.start()次に はconsole.log(「接続」); }); //リスニングクライアント・サーバ・メソッド呼び出し connection.on( "SENDMSG"、(MSG)=> { $( "dispaly・メッセージ")アペンド( `<P> $ {MSG} </ P>`);. }); $( "#送信")をクリック(。 = E> { CONST = $のMSG( "MSGの#")のVal();. //サービス方法がDepartmentNoticeの終了コール (MSG、 "DepartmentNotice")connection.invokeを .then(()=>{ にconsole.log( "送信完了メッセージ"); }); })
上記の最終結果が異なるメッセージングクライアント間の連動を実現していることがわかります
実際にSignalrはまた、例えば、ランダムにMVCで直接メッセージをプッシュする使用依存性注入コントローラを注入することができます
パブリッククラスにHomeController:コントローラ { プライベート読み取り専用IHubContext <NewsPushHub> _hub。 公的にHomeController(IHubContext <NewsPushHub>ハブ) { this._hub =ハブ。 } 公共IActionResultインデックス() { _hub.Clients.All.SendAsync( "温度"、 "テスト")。 ビューを返します(); } }
上記のコードから、ハブは限りクライアント・アクセス・インデックス・インタフェースがあるとして、すべてのクライアントに通知しますNewsPushHubホームコントローラ内で見注入し
概要:SignalRは、元の複雑な2非効率なプログラミング簡単、Siganlrは、それらがモード3接続クライアントとサーバのサポート限り最も効率的なコース(1、2、長いポーリングモードを、サーバ3は、イベント、のWebSocketを送信します)これは、WebSocketのですが、ブラウザの一部がサポートされていません。