ASP.NET SignalR と ASP.NET Core SignalR の違い
ASP.NET Core SignalR は、ASP.NET SignalR 用のクライアントまたはサーバーと互換性がありません。 この記事では、ASP.NET Core SignalR で削除または変更された機能について詳しく説明します。
SignalR バージョンを識別する方法
ASP.NET SignalR | ASP.NET Core SignalR | |
---|---|---|
サーバー NuGet パッケージ | Microsoft.AspNet.SignalR | なし。 Microsoft.AspNetCore.App 共有フレームワークに含まれています。 |
クライアント NuGet パッケージ | Microsoft.AspNet.SignalR.Client Microsoft.AspNet.SignalR。JS |
Microsoft.AspNetCore.SignalR.Client |
JavaScript クライアント npm パッケージ | signalr | @microsoft/signalr |
Java クライアント | GitHub リポジトリ (非推奨) | Maven パッケージ com.microsoft.signalr |
サーバー アプリの種類 | ASP.NET (System.Web) または OWIN セルフホスト | ASP.NET Core |
サポートされているサーバー プラットフォーム | .NET Framework 4.5 以降 | .NET Core 3.0 以降 |
ASP.NET SignalR | ASP.NET Core SignalR | |
---|---|---|
サーバー NuGet パッケージ | Microsoft.AspNet.SignalR | Microsoft.AspNetCore.App (.NET Core) Microsoft.AspNetCore.SignalR (.NET フレームワーク) |
クライアント NuGet パッケージ | Microsoft.AspNet.SignalR.Client Microsoft.AspNet.SignalR。JS |
Microsoft.AspNetCore.SignalR.Client |
JavaScript クライアント npm パッケージ | signalr | @aspnet/signalr |
Java クライアント | GitHub リポジトリ (非推奨) | Maven パッケージ com.microsoft.signalr |
サーバー アプリの種類 | ASP.NET (System.Web) または OWIN セルフホスト | ASP.NET Core |
サポートされているサーバー プラットフォーム | .NET Framework 4.5 以降 | .NET Framework 4.6.1 以降 .NET Core 2.1 以降 |
機能の違い
自動再接続
ASP.NET SignalR の場合:
- 接続がドロップされた場合、SignalR の既定では、サーバーへの再接続が試行されます。
ASP.NET Core SignalR の場合:
- 自動再接続は、.NET クライアントと JavaScript クライアントの両方でオプトインされています。
HubConnection connection = new HubConnectionBuilder()
.WithUrl(new Uri("http://127.0.0.1:5000/chathub"))
.WithAutomaticReconnect()
.Build();
const connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.withAutomaticReconnect()
.build();
ASP.NET Core 3.0 より前のバージョンでは、SignalR は自動再接続をサポートしていません。 クライアントが切断された場合、ユーザーは再接続のために明示的に新しい接続を開始する必要があります。 ASP.NET SignalR の場合、接続がドロップされると、SignalR によってサーバーへの再接続が試行されます。
プロトコルのサポート
ASP.NET Core SignalR は、JSON のほか、MessagePack をベースにした新しいバイナリ プロトコルもサポートしています。 また、カスタム プロトコルを作成できます。
トランスポート
ASP.NET Core SignalR では、永続的フレーム トランスポートはサポートされていません。
サーバーに関する違い
ASP.NET Core SignalR のサーバー側ライブラリは Microsoft.AspNetCore.App に含まれており、ASP.NET Core Web Application テンプレートで Razor と MVC プロジェクトの両方に使われています。
ASP.NET Core SignalR は、ASP.NET Core ミドルウェアです。 Startup.ConfigureServices
内で AddSignalR を呼び出して構成する必要があります。
services.AddSignalR()
ルーティングを構成するには、Startup.Configure
メソッド内の UseEndpoints メソッドの呼び出しの中でハブにルートをマップします。
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/hub");
});
ルーティングを構成するには、Startup.Configure
メソッド内の UseSignalR メソッドの呼び出しの中でハブにルートをマップします。
app.UseSignalR(routes =>
{
routes.MapHub<ChatHub>("/hub");
});
固定セッション
ASP.NET SignalR のスケールアウト モデルを使うと、クライアントからファーム内の任意のサーバーに再接続してメッセージを送信することができます。 ASP.NET Core SignalR では、接続している間、クライアントは同じサーバーと対話する必要があります。 Redis を使ったスケールアウトの場合、固定セッションが必要であることを意味します。 Azure SignalR Service を使ったスケールアウトの場合、クライアントへの接続はサービスによって処理されるため、固定セッションは必要ありません。
接続ごとに 1 つのハブ
ASP.NET Core SignalR では、接続モデルが簡略化されています。 複数のハブへのアクセスを共有するために 1 つの接続が使われるのではなく、1 つのハブに直接接続されます。
ストリーム
ASP.NET Core SignalR は、ハブからクライアントへのデータのストリーミングをサポートするようになりました。
都道府県
クライアントとハブの間で任意の状態を渡す機能 (HubState
と呼ばれることもよくあります) と、進行状況メッセージのサポートは削除されました。 現在のところ、ハブ プロキシに相当するものはありません。
PersistentConnection の削除
ASP.NET Core SignalR では、PersistentConnection クラスが削除されました。
GlobalHost
ASP.NET Core では、フレームワークに依存関係の挿入 (DI) が組み込まれています。 サービスから DI を使って HubContext にアクセスすることができます。 ASP.NET SignalR で HubContext
を取得するために使われる GlobalHost
オブジェクトは、ASP.NET Core SignalR には存在しません。
HubPipeline
ASP.NET Core SignalR は、HubPipeline
モジュールをサポートしていません。
クライアントに関する違い
TypeScript
ASP.NET Core SignalR クライアントは TypeScript で書かれています。 JavaScript クライアントを使う場合は、JavaScript または TypeScript で書くことができます。
JavaScript クライアントは npm でホストされている
ASP.NET バージョンの場合、Visual Studio の NuGet パッケージを介して JavaScript クライアントを入手していました。 ASP.NET Core バージョンの場合、@microsoft/signalr
npm パッケージに JavaScript ライブラリが含まれています。 このパッケージは ASP.NET Core Web アプリケーション テンプレートには含まれていません。 @microsoft/signalr
npm パッケージを取得してインストールするには、npm を使います。
npm init -y
npm install @microsoft/signalr
ASP.NET バージョンの場合、Visual Studio の NuGet パッケージを介して JavaScript クライアントを入手していました。 ASP.NET Core バージョンの場合、@aspnet/signalr
npm パッケージに JavaScript ライブラリが含まれています。 このパッケージは ASP.NET Core Web アプリケーション テンプレートには含まれていません。 @aspnet/signalr
npm パッケージを取得してインストールするには、npm を使います。
npm init -y
npm install @aspnet/signalr
jQuery
jQuery への依存関係はなくなりましたが、プロジェクトには引き続き jQuery を使えます。
Internet Explorer のサポート
ASP.NET Core SignalR は Microsoft Internet Explorer をサポートしていませんが、ASP.NET SignalR は Microsoft Internet Explorer 8 以降をサポートしています。 詳細については、「ASP.NET Core SignalR でサポートされているプラットフォーム」を参照してください。
JavaScript クライアント メソッドの構文
JavaScript の構文は ASP.NET バージョンの SignalR から変更されました。 接続を作成するには、$connection
オブジェクトを使うのではなく、HubConnectionBuilder API を使います。
const connection = new signalR.HubConnectionBuilder()
.withUrl("/hub")
.build();
ハブから呼び出すことができるクライアント メソッドを指定するには、on メソッドを使います。
JavaScript の構文は ASP.NET バージョンの SignalR から変更されました。 接続を作成するには、$connection
オブジェクトを使うのではなく、HubConnectionBuilder API を使います。
const connection = new signalR.HubConnectionBuilder()
.withUrl("/hub")
.build();
ハブから呼び出すことができるクライアント メソッドを指定するには、on メソッドを使います。
connection.on("ReceiveMessage", (user, message) => {
const msg = message.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">");
const encodedMsg = `${user} says ${msg}`;
console.log(encodedMsg);
});
クライアント メソッドを作成したら、ハブの接続を開始します。 エラーのログ記録と処理には、catch メソッドをチェーンします。
connection.start().catch(err => console.error(err));
ハブ プロキシ
ハブ プロキシは自動生成されなくなりました。 代わりに、メソッド名が文字列として invoke API に渡されます。
ハブ プロキシは自動生成されなくなりました。 代わりに、メソッド名が文字列として invoke API に渡されます。
.NET とその他のクライアント
Microsoft.AspNetCore.SignalR.Client NuGet パッケージには、ASP.NET Core SignalR 用の .NET クライアント ライブラリが含まれています。
ハブへの接続のインスタンスを作成および構築するには、HubConnectionBuilder を使います。
connection = new HubConnectionBuilder()
.WithUrl("url")
.Build();
スケールアウトの違い
ASP.NET SignalR は SQL Server と Redis をサポートしています。 ASP.NET Core SignalR は Azure SignalR Service と Redis をサポートしています。
ASP.NET
ASP.NET Core
その他のリソース
ASP.NET Core