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 の場合:

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, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
    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

その他のリソース