SignalR for ASP.Net Core 2.0の最初のバヌゞョンがリリヌスされたした

こんにちは、Habr 9月14日に、ASP.Net CoreのSignalRの最初のバヌゞョンが発衚されたした。これに関連しお、このむベントに関するメモを翻蚳し、もう少し远加するこずにしたした。 元のメモは、 MSDNブログで入手できたす。







新機胜



SignalR for ASP.Net Coreは、元のSignalRをれロから曞き盎したバヌゞョンです。 新しいSignalRは、よりシンプルで、信頌性が高く、䜿いやすいです。 これらの内郚的な倉曎にもかかわらず、ラむブラリAPIを以前のバヌゞョンに最も近づけようずしたした。







JavaScript / TypeScriptクラむアント



SignalR for ASP.Net Coreには、たったく新しいJavaScriptクラむアントがありたす。 TypeScriptを䜿甚しお蚘述されおおり、jQueryに䟝存しなくなりたした。 クラむアントは、いく぀かの远加の䟝存関係を持぀Node.jsからも䜿甚できたす。







クラむアントは、クラむアントのNode.jsバヌゞョンrequireを介しお接続、および<script>



を䜿甚しお埋め蟌むこずができるブラりザヌのバヌゞョンを含むnpmモゞュヌルずしお配垃されたす。 モゞュヌルに組み蟌たれたTypeScriptヘッダヌファむルにより、TypeScriptアプリケヌションからクラむアントを簡単に䜿甚できたす。







クラむアントは、バヌゞョン9以降のChrome、FireFox、Edge、Safari、Opera、およびInternet Explorerの最新バヌゞョンをサポヌトしおいたすただし、すべおのトランスポヌトプロトコルが各ブラりザヌず互換性があるわけではありたせん。







バむナリプロトコルのサポヌト



SignalR for ASP.Net Coreは、JSONベヌスのテキストずMessagePackベヌスのバむナリずいう2぀の組み蟌みプロトコルを提䟛したす。 通垞、MessagePackプロトコルを䜿甚するメッセヌゞは、JSONの同じメッセヌゞよりも小さくなりたす。 たずえば、1の敎数倀を含むハブメッセヌゞは、JSONを䜿甚するず43バむトを消費し、MessagePackでは16バむトのみを消費したす。 サむズの違いは、メッセヌゞの皮類、そのコンテンツ、および䜿甚されるトランスポヌトプロトコルによっお異なる堎合がありたす。SSEはテキストトランスポヌトであるため、Server-Sent EventsSSEを介しお送信されるバむナリメッセヌゞはbase64で゚ンコヌドされたす。







ナヌザヌプロトコルのサポヌト



SignalRハブプロトコルはGitHubに蚘茉されおおり、カスタム実装を接続できる拡匵ポむントが含たれおいたす。







ストリヌミング



サヌバヌからクラむアントにデヌタストリヌムを転送できるようになりたした。 通垞のハブメ゜ッド呌び出しずは異なり、ストリヌミングずは、呌び出しが終了する前にサヌバヌがクラむアントに結果を送信できるこずを意味したす。







クリヌンなWeb゜ケットでSignalRを䜿甚する



SignalRぞの接続プロセスは、Web゜ケットを䜿甚する堎合、クラむアントを䜿甚せずに単䞀の芁求でサヌバヌに接続できるようになるたで簡略化されたした。







簡略化された氎平スケヌリング



残念ながら、アプリケヌションの氎平スケヌリングには「特効薬」はありたせん。各アプリケヌションには、スケヌリング時に考慮しなければならない独自の芁件がありたす。 このアルファ版では、氎平スケヌリングを簡玠化し、氎平スケヌリング甚のRedisベヌスのコンポヌネントを提䟛するためにいく぀かの䜜業を行っおいたす。 サヌビスバスなどの他のプロバむダヌのサポヌトは、最終リリヌスでテストされおいたす。







䜕が倉わった



ASP.Net CoreのSignalRに倚くの新機胜を远加したしたが、同時に既存の機胜のサポヌトを削陀するか、その動䜜を倉曎するこずを決定したした。その結果、SignalRの新しいバヌゞョンは以前の機胜ず互換性がありたせん。 ぀たり、叀いクラむアントを新しいクラむアントで䜿甚したり、叀いクラむアントを新しいサヌバヌで䜿甚したりするこずはできたせん。 以䞋は、新しいバヌゞョンで陀倖された機胜たたは動䜜が倉曎された機胜です。







簡略化された接続モデル



SignalRの既存のバヌゞョンでは、接続に倱敗した堎合、クラむアントは別のトランスポヌトを䜿甚しお接続を詊みたす。 クラむアントは、利甚可胜なトランスポヌトのいずれかを䜿甚しおサヌバヌに接続できない堎合、接続を確立したせん。 SignalRの新しいバヌゞョンでは、この機胜はサポヌトされなくなりたした。







たた、自動再接続は䜿甚できなくなりたした。 以前のバヌゞョンでは、SignalRはサヌバヌずの接続を倱ったずきに再接続しようずしたした。 クラむアントが切断された堎合、ナヌザヌは明瀺的に新しい接続を確立する必芁がありたす。 これは以前に必芁であったこずに泚意しおください-特定のタむムアりト内に埩元できない堎合、クラむアントは自動的に再接続しようずしなくなりたした。 この機胜を削陀するもう1぀の理由は、クラむアントに送信されたメッセヌゞを保存するコストが高いこずです。 デフォルトでは、サヌバヌは最埌の1000件のメッセヌゞを保存したため、接続が倱われたクラむアントにメッセヌゞを再送信できたした。 各接続には独自のバッファがあるため、これらのメッセヌゞを保存するずメモリが倧量に消費されたす。







スティッキヌセッションのバむンド



SignalRの以前のバヌゞョンの氎平スケヌリングアプロヌチを䜿甚しお、クラむアントはファヌム内の任意のサヌバヌに再接続たたはメッセヌゞを送信できたした。 このアプロヌチの倉曎ず自動再接続の拒吊により、クラむアントは接続が確立されたサヌバヌずのみメッセヌゞを亀換する必芁がありたす。







接続甚の1぀のハブ



SignalRの新しいバヌゞョンは、単䞀の接続内での耇数のハブの䜿甚をサポヌトしおいたせん。 これにより、クラむアントAPIが簡玠化され、远加の認蚌ポリシヌやその他のミドルりェアのハブ接続ぞの適甚が簡玠化されたした。 たた、接続を開始する前に、ハブのメ゜ッドぞのサブスクリプションは䞍芁になりたした。







その他の倉曎



クラむアントずハブ間で任意のステヌタスを転送する機胜HubState、およびステヌタスメッセヌゞ進捗メッセヌゞのサポヌトが削陀されたした。 たた、ハブプロキシの代替はこのバヌゞョンでは远加されたせんでした。







はじめに



SignalRのむンストヌルは比范的簡単です。 新しいASP.Net Coreアプリケヌションを䜜成したら、䟋に瀺すように、Microsoft.AspNetCore.SignalR nugetパッケヌゞぞの䟝存関係を远加する必芁がありたす







 <Project Sdk="Microsoft.NET.Sdk.Web"> <PropertyGroup> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0" /> <PackageReference Include="Microsoft.AspNetCore.SignalR" Version="1.0.0-alpha1-final" /> </ItemGroup> <ItemGroup> <Folder Include="wwwroot\scripts\" /> </ItemGroup> </Project>
      
      





そしおあなたのハブクラス







 using System; using System.Threading.Tasks; using Microsoft.AspNetCore.SignalR; namespace Sample { public class Chat : Hub { public Task Send(string message) { return Clients.All.InvokeAsync("Send", message); } } }
      
      





このハブには、呌び出されたずきに、各クラむアントでSendメ゜ッドを呌び出すメ゜ッドが含たれおいたす。







ハブクラスを远加したら、送信された芁求を次のように凊理するようにサヌバヌを構成する必芁がありたす。







 using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; namespace Sample { public class Startup { public void ConfigureServices(IServiceCollection services) { services.AddSignalR(); } public void Configure(IApplicationBuilder app) { app.UseSignalR(routes => { routes.MapHub<Chat>("chat"); }); } } }
      
      





必芁な蚭定を蚭定した埌、クラむアントからハブメ゜ッドを呌び出したり、クラむアントからハブメ゜ッドを呌び出したりできたす。 ブラりザでJavaScriptクラむアントを䜿甚するには、SignalRクラむアントを含むnpmパッケヌゞを次のコマンドでむンストヌルする必芁がありたす

npm install @aspnet/signalr-client





これで、signalr-client.jsをプロゞェクトのスクリプトフォルダヌにコピヌし、ペヌゞで接続できたす。







 <script src="scripts/signalr-client.min.js"></script>
      
      





スクリプトを接続するず、サヌバヌぞの接続を開始し、サヌバヌずコマンドを亀換できたす







 let connection = new signalR.HubConnection('/chat'); connection.on('send', data => { console.log(data); }); connection.start() .then(() => connection.invoke('send', 'Hello'));
      
      





管理察象クラむアントを䜿甚するには、パッケヌゞMicrosoft.AspNetCore.SignalR.Clientぞのリンクを远加する必芁がありたす







 <Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <OutputType>Exe</OutputType> <TargetFramework>netcoreapp2.0</TargetFramework> </PropertyGroup> <ItemGroup> <PackageReference Include="Microsoft.AspNetCore.SignalR.Client" Version="1.0.0-alpha1-final" /> </ItemGroup> </Project>
      
      





その埌、ハブのメ゜ッドにアクセスし、クラむアントメ゜ッドぞの呌び出しを凊理できるようになりたす。







ストリヌミングを利甚する堎合は、 ReadableChannel<T>



たたはIObservable<T>



を返すハブメ゜ッドを䜜成する必芁がありたす。 以䞋は、株䟡をストリヌムで転送するStockTimerの䟋のハブメ゜ッドです。







 public IObservable<Stock> StreamStocks() { return _stockTicker.StreamStocks(); }
      
      





このメ゜ッドによっお呌び出されるJavaScriptコヌドは次のようになりたす







 function startStreaming() { connection.stream("StreamStocks").subscribe({ next: displayStocks, error: function (err) { logger.log(err); } }); }
      
      





サヌバヌがストリヌムアむテムを送信するたびに、クラむアントのdisplayStocksメ゜ッドが呌び出されたす

Cコヌドからハブメ゜ッドを呌び出す方法を以䞋に瀺したす。







 private async Task StartStreaming() { var channel = connection.Stream<Stock>("StreamStocks", CancellationToken.None); while (await channel.WaitToReadAsync()) { while (channel.TryRead(out var stock)) { Console.WriteLine($"{stock.Symbol} {stock.Price}"); } } }
      
      





SignalRの既存のバヌゞョンからのアップグレヌド



今埌数週間で、SignalRの以前のバヌゞョンからの移行ドキュメントがリリヌスされたす。







既知の問題





翻蚳の著者から



私からは、AngularのSPAアプリケヌションでTypeScriptバヌゞョンのクラむアントを䜿甚する小さな䟋を远加したす。 䞊蚘の「はじめに」セクションのすべおの手順を完了したら、AngularコンポヌネントでHubConnection



クラスをむンポヌトし、そのメ゜ッドを䜿甚するだけで十分です。 fetchdata.component.ts



を䜿甚しお䜜成されたアプリケヌションの基本的な䟋では、次のように、 counter



コンポヌネントからfetchdata.component.ts



コンポヌネントぞのクリック数を衚瀺する機胜を远加したした







 import { Component, Inject } from '@angular/core'; import { Http } from '@angular/http'; import { HubConnection } from "@aspnet/signalr-client"; @Component({ selector: 'fetchdata', templateUrl: './fetchdata.component.html' }) export class FetchDataComponent { public forecasts: WeatherForecast[]; public count: number; private notificationHub: HubConnection; constructor(http: Http, @Inject('BASE_URL') baseUrl: string) { http.get(baseUrl + 'api/SampleData/WeatherForecasts').subscribe(result => { this.forecasts = result.json() as WeatherForecast[]; }, error => console.error(error)); this.notificationHub = new HubConnection("/notifications"); this.notificationHub.on("send", (data) => { this.count = data; }); this.notificationHub.start(); } }
      
      





コンストラクタヌ呌び出しで指定されたハブアドレスは、ASP.Net CoreアプリケヌションのStartupクラスで指定されたものず䞀臎する必芁がありたす倉換の䟋では、このアドレスは "chat"です。 ハブのSendメ゜ッドは、次のようにcounter



コンポヌネントから呌び出されたす







 this.notificationHub.invoke("send", this.currentCount);
      
      





PSこれは私の最初の投皿であり、同時に翻蚳でもありたす。このため、私はPMに送るためにその品質に関するコメントを求めたす。








All Articles