次の方法で共有


ASP.NET Core SignalR の構成

この記事では、ASP.NET Core SignalR の構成について説明します。

この記事のガイダンスを追加または置き換える BlazorSignalR ガイダンスについては、 ASP.NET Core BlazorSignalR ガイダンスを参照してください。

JSON/MessagePack シリアル化オプション

ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSONMessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。

JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。 AddJsonProtocolは、AddSignalRStartup.ConfigureServicesした後に追加できます。 AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください

たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Program.cs 内で次のコードを使用します。

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。

Newtonsoft.Json に切り替える

Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。

MessagePack シリアル化オプション

MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。

現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。

サーバー オプションを構成する

次の表では、 SignalR ハブを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ClientTimeoutInterval 30 秒 サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。
HandshakeTimeout 15 秒 クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。 KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。
SupportedProtocols インストールされているすべてのプロトコル このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。
EnableDetailedErrors false true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。
StreamBufferCapacity 10 クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。
MaximumReceiveMessageSize 32 KB 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。
MaximumParallelInvocationsPerClient 1 キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。
DisableImplicitFromServicesParameters false ハブ メソッドの引数は、可能であれば DI から解決されます。

AddSignalRProgram.cs呼び出しに委任するオプションを指定することで、すべてのハブに対してオプションを構成できます。

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

単一ハブのオプションは、 AddSignalR で提供されるグローバル オプションをオーバーライドし、 AddHubOptionsを使用して構成できます。

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高度な HTTP 構成オプション

HttpConnectionDispatcherOptionsを使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubProgram.csにデリゲートを渡すことによって構成されます。

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

次の表では、ASP.NET Core SignalR の高度な HTTP オプションを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ApplicationMaxBufferSize 64 KB バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。
TransportMaxBufferSize 64 KB バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。
AuthorizationData Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。
Transports すべてのトランスポートが有効になっています。 クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。
LongPolling 以下を参照してください。 ロングポーリング トランスポートに固有の追加オプション。
WebSockets 以下を参照してください。 WebSocket トランスポートに固有の追加オプション。
MinimumProtocolVersion 0 ネゴシエート プロトコルの最小バージョンを指定します。 これは、クライアントを新しいバージョンに制限するために使用されます。
CloseOnAuthenticationExpiration 偽り このオプションを設定すると、認証の有効期限の追跡が有効になり、トークンの有効期限が切れると接続が閉じます。

Long Polling トランスポートには、 LongPolling プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
PollTimeout 90 秒 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。

WebSocket トランスポートには、 WebSockets プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
CloseTimeout 5 秒 サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。
SubProtocolSelector null Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。

クライアント オプションを構成する

クライアント オプションは、 HubConnectionBuilder の種類 (.NET および JavaScript クライアントで使用可能) で構成できます。 Java クライアントでも使用できますが、 HttpHubConnectionBuilder サブクラスにはビルダー構成オプションと、 HubConnection 自体が含まれています。

ログ記録の構成

ログ記録は、 ConfigureLogging メソッドを使用して .NET クライアントで構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、 ASP.NET Core のログ記録 に関するドキュメントを参照してください。

ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 完全な一覧については、ドキュメント の組み込みログ プロバイダー のセクションを参照してください。

たとえば、コンソールのログ記録を有効にするには、 Microsoft.Extensions.Logging.Console NuGet パッケージをインストールします。 AddConsole拡張メソッドを呼び出します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript クライアントには、同様の configureLogging メソッドが存在します。 生成するログ メッセージの最小レベルを示す LogLevel 値を指定します。 ログはブラウザー コンソール ウィンドウに書き込まれます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel値の代わりに、ログ レベル名を表すstring値を指定することもできます。 これは、SignalR定数にアクセスできない環境でLogLevelログ記録を構成する場合に便利です。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

次の表に、使用可能なログ レベルを示します。 configureLoggingに指定する値は、ログに記録される最小ログ レベルを設定します。 このレベルでログに記録されたメッセージ 、またはテーブルの後に一覧表示されているレベルがログに記録されます。

LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info 又はinformation LogLevel.Information
warn 又はwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

ログ記録を完全に無効にするには、signalR.LogLevel.None メソッドでconfigureLoggingを指定します。

ログ記録の詳細については、 SignalR 診断のドキュメントを参照してください

SignalR Java クライアントは、ログ記録に SLF4J ライブラリを使用します。 これは、ライブラリのユーザーが特定のログの依存関係を取り込むことによって、独自の特定のログ実装を選択できるようにする、高レベルのログ記録 API です。 次のコード スニペットは、java.util.logging Java クライアントでSignalRを使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係のログ記録を構成しない場合、SLF4J は、次の警告メッセージを含む既定の操作なしロガーを読み込みます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

許可されるトランスポートを構成する

SignalRによって使用されるトランスポートは、WithUrl呼び出し (JavaScript のwithUrl) で構成できます。 HttpTransportTypeの値のビットごとの OR を使用して、指定されたトランスポートのみを使用するようにクライアントを制限できます。 既定では、すべてのトランスポートが有効になっています。

たとえば、Server-Sent イベント トランスポートを無効にし、WebSocket 接続と Long Polling 接続を許可するには、次のようにします。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript クライアントでは、トランスポートは、transportに指定された options オブジェクトの withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

このバージョンの Java クライアント WebSocket は、使用可能な唯一のトランスポートです。

Java クライアントでは、トランスポートはwithTransportHttpHubConnectionBuilder メソッドで選択されます。 Java クライアントは、既定で WebSocket トランスポートを使用します。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

SignalR Java クライアントでは、トランスポート フォールバックはまだサポートされていません。

ベアラー認証を構成する

SignalR要求と共に認証データを提供するには、AccessTokenProvider オプション (JavaScript のaccessTokenFactory) を使用して、目的のアクセス トークンを返す関数を指定します。 .NET クライアントでは、このアクセス トークンは HTTP "ベアラー認証" トークンとして渡されます (Authorization型の Bearer ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンはベアラー トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSockets 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。

.NET クライアントでは、AccessTokenProviderの options デリゲートを使用して、WithUrl オプションを指定できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript クライアントでは、アクセス トークンは、accessTokenFactoryの options オブジェクトに withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

SignalR Java クライアントでは、HttpHubConnectionBuilder にアクセス トークン ファクトリを提供することで、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して RxJavaSingle<String> を指定します。 Single.defer を呼び出すと、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

タイムアウトとキープアライブのオプションを構成する

タイムアウトとキープアライブ動作を構成するための追加のオプション:

選択肢 既定値 説明
WithServerTimeout 30 秒 (30,000 ミリ秒) サーバー アクティビティのタイムアウト。 HubConnectionBuilderで直接設定されます。 サーバーがこの間隔でメッセージを送信していない場合、クライアントはサーバーが切断されたと見なし、 Closed イベント (JavaScript でonclose ) をトリガーします。 この値は、ping メッセージがサーバーから送信 され、 タイムアウト期間内にクライアントによって受信されるのに十分な大きさである必要があります。 推奨される値は、ping が到着するまでの時間を許容するために、サーバーのキープアライブ間隔 (WithKeepAliveInterval) の値の少なくとも 2 倍の数値です。
HandshakeTimeout 15 秒 初期サーバー ハンドシェイクのタイムアウト。 HubConnection オブジェクト自体で使用できます。 サーバーがこの間隔でハンドシェイク応答を送信しない場合、クライアントはハンドシェイクをキャンセルし、 Closed イベント (JavaScript でonclose ) をトリガーします。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
WithKeepAliveInterval 15 秒 クライアントが ping メッセージを送信する間隔を決定し、その間隔は HubConnectionBuilder に直接設定されます。 この設定により、サーバーでハードの切断を検出できます。たとえば、クライアントがコンピューターをネットワークから取り外したときなどです。 クライアントからメッセージを送信すると、タイマーが間隔の開始にリセットされます。 クライアントがサーバー上の ClientTimeoutInterval セットでメッセージを送信していない場合、サーバーはクライアントが切断されたと見なします。

.NET クライアントでは、タイムアウト値は TimeSpan 値として指定されます。

次の例は、既定値の 2 倍の値を示しています。

var builder = new HubConnectionBuilder()
    .WithUrl(Navigation.ToAbsoluteUri("/chathub"))
    .WithServerTimeout(TimeSpan.FromSeconds(60))
    .WithKeepAliveInterval(TimeSpan.FromSeconds(30))
    .Build();

builder.On<string, string>("ReceiveMessage", (user, message) => ...

await builder.StartAsync();

ステートフルな再接続を構成する

SignalR ステートフル再接続を使用すると、ネットワーク接続の切り替え時や短時間のアクセス不能時など、ネットワーク接続が一時的に切断されたクライアントが検知するダウンタイムが短縮されます。

ステートフル再接続は、次の方法でこれを実現します。

  • サーバーとクライアント上のデータを一時的にバッファリングする。
  • サーバーとクライアントの両方で受信したメッセージの確認 (ACK- ing)。
  • 接続が稼働していることを認識し、接続が停止している間に送信された可能性のあるメッセージを再生します。

ステートフル 再接続は、.NET 8 以降で使用できます。

サーバー ハブ エンドポイントとクライアントの両方でステートフル再接続を選択します:

  • サーバー ハブ エンドポイントの構成を更新して、AllowStatefulReconnects オプションを有効にします。

    app.MapHub<MyHub>("/hubName", options =>
    {
        options.AllowStatefulReconnects = true;
    });
    

    必要に応じて、サーバーで許可される最大バッファー サイズ (バイト単位) をグローバルに設定することも、StatefulReconnectBufferSize オプションを使用して特定のハブに対して設定することもできます:

    StatefulReconnectBufferSize オプションのグローバル設定:

    builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
    

    特定のハブに対して設定されたStatefulReconnectBufferSizeオプション

    builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
    

    StatefulReconnectBufferSize オプションは省略可能で、既定値は 100,000 バイトです。

  • JavaScript または TypeScript クライアント コードを更新して、withStatefulReconnect オプションを有効にします:

    const builder = new signalR.HubConnectionBuilder()
      .withUrl("/hubname")
      .withStatefulReconnect({ bufferSize: 1000 });  // Optional, defaults to 100,000
    const connection = builder.build();
    

    bufferSize オプションは省略可能で、既定値は 100,000 バイトです。

  • .NET クライアント コードを更新して、WithStatefulReconnect オプションを有効にします:

      var builder = new HubConnectionBuilder()
          .WithUrl("<hub url>")
          .WithStatefulReconnect();
      builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000);
      var hubConnection = builder.Build();
    

    StatefulReconnectBufferSize オプションは省略可能で、既定値は 100,000 バイトです。

追加のオプションの構成

追加のオプションは、WithUrlwithUrl (JavaScript のHubConnectionBuilder) メソッド、または Java クライアントのHttpHubConnectionBuilderのさまざまな構成 API で構成できます。

.NET オプション 既定値 説明
AccessTokenProvider null HTTP 要求でベアラー認証トークンとして提供される文字列を返す関数。
SkipNegotiation false これを true に設定してネゴシエーション手順をスキップします。 WebSocket トランスポートが唯一有効なトランスポートである場合にのみサポートされます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。
ClientCertificates 空っぽ 認証要求に送信する TLS 証明書のコレクション。
Cookies 空っぽ すべての HTTP 要求で送信する HTTP Cookie のコレクション。
Credentials 空っぽ すべての HTTP 要求で送信する資格情報。
CloseTimeout 5 秒 WebSocket のみ。 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。
Headers 空っぽ すべての HTTP 要求で送信する追加の HTTP ヘッダーのマップ。
HttpMessageHandlerFactory null HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 WebSocket 接続には使用されません。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返します。 ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合、構成されたオプション (Cookie やヘッダーなど) は新しいハンドラーには適用されません。
Proxy null HTTP 要求を送信するときに使用する HTTP プロキシ。
UseDefaultCredentials false HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 これにより、Windows 認証を使用できるようになります。
WebSocketConfiguration null 追加の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。
ApplicationMaxBufferSize 1 MB クライアントがバックプレッシャーを適用する前に、サーバーから受信するデータをバッファリングする最大バイト数。 この値を大きくすると、クライアントはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。
TransportMaxBufferSize 1 MB バックプレッシャを観測する前にクライアントによってバッファー処理され、ユーザー アプリケーションから送信される最大バイト数。 この値を大きくすると、クライアントはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。

.NET クライアントでは、これらのオプションは、 WithUrlに提供されるオプション デリゲートによって変更できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript クライアントでは、次のオプションを、 withUrlに提供される JavaScript オブジェクトで指定できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Java クライアントでは、これらのオプションは、HttpHubConnectionBuilder から返される HubConnectionBuilder.create("HUB URL") でメソッドを使用して構成できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

その他のリソース

JSON/MessagePack シリアル化オプション

ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSONMessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。

JSON シリアル化は、AddJsonProtocol拡張メソッドを使用してサーバーで構成できます。これは、AddSignalR メソッドでStartup.ConfigureServicesした後に追加できます。 AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerSettings プロパティは、引数と戻り値のシリアル化を構成するために使用できる Json.NET JsonSerializerSettings オブジェクトです。 詳細については、 Json.NET ドキュメントを参照してください

たとえば、既定の キャメル ケース 名ではなく、"PascalCase" プロパティ名を使用するようにシリアライザーを構成するには、 Startup.ConfigureServicesで次のコードを使用します。

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。

MessagePack シリアル化オプション

MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。

現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。

サーバー オプションを構成する

次の表では、 SignalR ハブを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
HandshakeTimeout 15 秒 クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。 KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。
SupportedProtocols インストールされているすべてのプロトコル このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。
EnableDetailedErrors false true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。

AddSignalRStartup.ConfigureServices呼び出しに委任するオプションを指定することで、すべてのハブに対してオプションを構成できます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

単一ハブのオプションは、 AddSignalR で提供されるグローバル オプションをオーバーライドし、 AddHubOptionsを使用して構成できます。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高度な HTTP 構成オプション

HttpConnectionDispatcherOptionsを使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubStartup.Configureにデリゲートを渡すことによって構成されます。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

次の表では、ASP.NET Core SignalR の高度な HTTP オプションを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ApplicationMaxBufferSize 32 KB サーバーがバッファーするクライアントから受信した最大バイト数。 この値を大きくすると、サーバーは大きなメッセージを受信できますが、メモリ消費量に悪影響を与える可能性があります。
AuthorizationData Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。
TransportMaxBufferSize 32 KB サーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーは大きなメッセージを送信できますが、メモリ消費量に悪影響を与える可能性があります。
Transports すべてのトランスポートが有効になっています。 クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。
LongPolling 以下を参照してください。 ロングポーリング トランスポートに固有の追加オプション。
WebSockets 以下を参照してください。 WebSocket トランスポートに固有の追加オプション。

Long Polling トランスポートには、 LongPolling プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
PollTimeout 90 秒 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。

WebSocket トランスポートには、 WebSockets プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
CloseTimeout 5 秒 サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。
SubProtocolSelector null Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。

クライアント オプションを構成する

クライアント オプションは、 HubConnectionBuilder の種類 (.NET および JavaScript クライアントで使用可能) で構成できます。 Java クライアントでも使用できますが、 HttpHubConnectionBuilder サブクラスにはビルダー構成オプションと、 HubConnection 自体が含まれています。

ログ記録の構成

ログ記録は、 ConfigureLogging メソッドを使用して .NET クライアントで構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、 ASP.NET Core のログ記録 に関するドキュメントを参照してください。

ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 完全な一覧については、ドキュメント の組み込みログ プロバイダー のセクションを参照してください。

たとえば、コンソールのログ記録を有効にするには、 Microsoft.Extensions.Logging.Console NuGet パッケージをインストールします。 AddConsole拡張メソッドを呼び出します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript クライアントには、同様の configureLogging メソッドが存在します。 生成するログ メッセージの最小レベルを示す LogLevel 値を指定します。 ログはブラウザー コンソール ウィンドウに書き込まれます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

ログ記録を完全に無効にするには、signalR.LogLevel.None メソッドでconfigureLoggingを指定します。

ログ記録の詳細については、 SignalR 診断のドキュメントを参照してください

SignalR Java クライアントは、ログ記録に SLF4J ライブラリを使用します。 これは、ライブラリのユーザーが特定のログの依存関係を取り込むことによって、独自の特定のログ実装を選択できるようにする、高レベルのログ記録 API です。 次のコード スニペットは、java.util.logging Java クライアントでSignalRを使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係のログ記録を構成しない場合、SLF4J は、次の警告メッセージを含む既定の操作なしロガーを読み込みます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

許可されるトランスポートを構成する

SignalRによって使用されるトランスポートは、WithUrl呼び出し (JavaScript のwithUrl) で構成できます。 HttpTransportTypeの値のビットごとの OR を使用して、指定されたトランスポートのみを使用するようにクライアントを制限できます。 既定では、すべてのトランスポートが有効になっています。

たとえば、Server-Sent イベント トランスポートを無効にし、WebSocket 接続と Long Polling 接続を許可するには、次のようにします。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript クライアントでは、トランスポートは、transportに指定された options オブジェクトの withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

ベアラー認証を構成する

SignalR要求と共に認証データを提供するには、AccessTokenProvider オプション (JavaScript のaccessTokenFactory) を使用して、目的のアクセス トークンを返す関数を指定します。 .NET クライアントでは、このアクセス トークンは HTTP "ベアラー認証" トークンとして渡されます (Authorization型の Bearer ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンはベアラー トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSockets 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。

.NET クライアントでは、AccessTokenProviderの options デリゲートを使用して、WithUrl オプションを指定できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript クライアントでは、アクセス トークンは、accessTokenFactoryの options オブジェクトに withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

SignalR Java クライアントでは、HttpHubConnectionBuilder にアクセス トークン ファクトリを提供することで、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して RxJavaSingle<String> を指定します。 Single.defer を呼び出すと、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

タイムアウトとキープアライブのオプションを構成する

タイムアウトとキープアライブ動作を構成するための追加のオプションは、 HubConnection オブジェクト自体で使用できます。

選択肢 既定値 説明
ServerTimeout 30 秒 (30,000 ミリ秒) サーバー アクティビティのタイムアウト。 サーバーがこの間隔でメッセージを送信していない場合、クライアントはサーバーが切断されたと見なし、 Closed イベント (JavaScript でonclose ) をトリガーします。 この値は、ping メッセージがサーバーから送信 され、 タイムアウト期間内にクライアントによって受信されるのに十分な大きさである必要があります。 推奨される値は、ping が到着する時間を許可するサーバーの KeepAliveInterval 値の少なくとも 2 倍の数値です。
HandshakeTimeout 15 秒 初期サーバー ハンドシェイクのタイムアウト。 サーバーがこの間隔でハンドシェイク応答を送信しない場合、クライアントはハンドシェイクをキャンセルし、 Closed イベント (JavaScript でonclose ) をトリガーします。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。

.NET クライアントでは、タイムアウト値は TimeSpan 値として指定されます。

追加のオプションの構成

追加のオプションは、WithUrlwithUrl (JavaScript のHubConnectionBuilder) メソッド、または Java クライアントのHttpHubConnectionBuilderのさまざまな構成 API で構成できます。

.NET オプション 既定値 説明
AccessTokenProvider null HTTP 要求でベアラー認証トークンとして提供される文字列を返す関数。
SkipNegotiation false これを true に設定してネゴシエーション手順をスキップします。 WebSocket トランスポートが唯一有効なトランスポートである場合にのみサポートされます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。
ClientCertificates 空っぽ 認証要求に送信する TLS 証明書のコレクション。
Cookies 空っぽ すべての HTTP 要求で送信する HTTP Cookie のコレクション。
Credentials 空っぽ すべての HTTP 要求で送信する資格情報。
CloseTimeout 5 秒 WebSocket のみ。 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。
Headers 空っぽ すべての HTTP 要求で送信する追加の HTTP ヘッダーのマップ。
HttpMessageHandlerFactory null HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 WebSocket 接続には使用されません。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返します。 ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合、構成されたオプション (Cookie やヘッダーなど) は新しいハンドラーには適用されません。
Proxy null HTTP 要求を送信するときに使用する HTTP プロキシ。
UseDefaultCredentials false HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 これにより、Windows 認証を使用できるようになります。
WebSocketConfiguration null 追加の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。

.NET クライアントでは、これらのオプションは、 WithUrlに提供されるオプション デリゲートによって変更できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript クライアントでは、次のオプションを、 withUrlに提供される JavaScript オブジェクトで指定できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Java クライアントでは、これらのオプションは、HttpHubConnectionBuilder から返される HubConnectionBuilder.create("HUB URL") でメソッドを使用して構成できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

その他のリソース

JSON/MessagePack シリアル化オプション

ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSONMessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。

JSON シリアル化は、AddJsonProtocol拡張メソッドを使用してサーバーで構成できます。これは、AddSignalR メソッドでStartup.ConfigureServicesした後に追加できます。 AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerSettings プロパティは、引数と戻り値のシリアル化を構成するために使用できる Json.NET JsonSerializerSettings オブジェクトです。 詳細については、 Json.NET ドキュメントを参照してください

たとえば、既定の キャメル ケース 名ではなく、"PascalCase" プロパティ名を使用するようにシリアライザーを構成するには、 Startup.ConfigureServicesで次のコードを使用します。

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。

MessagePack シリアル化オプション

MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。

現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。

サーバー オプションを構成する

次の表では、 SignalR ハブを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ClientTimeoutInterval 30 秒 サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。
HandshakeTimeout 15 秒 クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。 KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。
SupportedProtocols インストールされているすべてのプロトコル このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。
EnableDetailedErrors false true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。

AddSignalRStartup.ConfigureServices呼び出しに委任するオプションを指定することで、すべてのハブに対してオプションを構成できます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

単一ハブのオプションは、 AddSignalR で提供されるグローバル オプションをオーバーライドし、 AddHubOptionsを使用して構成できます。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高度な HTTP 構成オプション

HttpConnectionDispatcherOptionsを使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubStartup.Configureにデリゲートを渡すことによって構成されます。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

次の表では、ASP.NET Core SignalR の高度な HTTP オプションを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ApplicationMaxBufferSize 32 KB サーバーがバッファーするクライアントから受信した最大バイト数。 この値を大きくすると、サーバーは大きなメッセージを受信できますが、メモリ消費量に悪影響を与える可能性があります。
AuthorizationData Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。
TransportMaxBufferSize 32 KB サーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーは大きなメッセージを送信できますが、メモリ消費量に悪影響を与える可能性があります。
Transports すべてのトランスポートが有効になっています。 クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。
LongPolling 以下を参照してください。 ロングポーリング トランスポートに固有の追加オプション。
WebSockets 以下を参照してください。 WebSocket トランスポートに固有の追加オプション。

Long Polling トランスポートには、 LongPolling プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
PollTimeout 90 秒 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。

WebSocket トランスポートには、 WebSockets プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
CloseTimeout 5 秒 サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。
SubProtocolSelector null Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。

クライアント オプションを構成する

クライアント オプションは、 HubConnectionBuilder の種類 (.NET および JavaScript クライアントで使用可能) で構成できます。 Java クライアントでも使用できますが、 HttpHubConnectionBuilder サブクラスにはビルダー構成オプションと、 HubConnection 自体が含まれています。

ログ記録の構成

ログ記録は、 ConfigureLogging メソッドを使用して .NET クライアントで構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、 ASP.NET Core のログ記録 に関するドキュメントを参照してください。

ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 完全な一覧については、ドキュメント の組み込みログ プロバイダー のセクションを参照してください。

たとえば、コンソールのログ記録を有効にするには、 Microsoft.Extensions.Logging.Console NuGet パッケージをインストールします。 AddConsole拡張メソッドを呼び出します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript クライアントには、同様の configureLogging メソッドが存在します。 生成するログ メッセージの最小レベルを示す LogLevel 値を指定します。 ログはブラウザー コンソール ウィンドウに書き込まれます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

ログ記録を完全に無効にするには、signalR.LogLevel.None メソッドでconfigureLoggingを指定します。

ログ記録の詳細については、 SignalR 診断のドキュメントを参照してください

SignalR Java クライアントは、ログ記録に SLF4J ライブラリを使用します。 これは、ライブラリのユーザーが特定のログの依存関係を取り込むことによって、独自の特定のログ実装を選択できるようにする、高レベルのログ記録 API です。 次のコード スニペットは、java.util.logging Java クライアントでSignalRを使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係のログ記録を構成しない場合、SLF4J は、次の警告メッセージを含む既定の操作なしロガーを読み込みます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

許可されるトランスポートを構成する

SignalRによって使用されるトランスポートは、WithUrl呼び出し (JavaScript のwithUrl) で構成できます。 HttpTransportTypeの値のビットごとの OR を使用して、指定されたトランスポートのみを使用するようにクライアントを制限できます。 既定では、すべてのトランスポートが有効になっています。

たとえば、Server-Sent イベント トランスポートを無効にし、WebSocket 接続と Long Polling 接続を許可するには、次のようにします。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript クライアントでは、トランスポートは、transportに指定された options オブジェクトの withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

このバージョンの Java クライアント WebSocket は、使用可能な唯一のトランスポートです。

ベアラー認証を構成する

SignalR要求と共に認証データを提供するには、AccessTokenProvider オプション (JavaScript のaccessTokenFactory) を使用して、目的のアクセス トークンを返す関数を指定します。 .NET クライアントでは、このアクセス トークンは HTTP "ベアラー認証" トークンとして渡されます (Authorization型の Bearer ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンはベアラー トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSockets 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。

.NET クライアントでは、AccessTokenProviderの options デリゲートを使用して、WithUrl オプションを指定できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript クライアントでは、アクセス トークンは、accessTokenFactoryの options オブジェクトに withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

SignalR Java クライアントでは、HttpHubConnectionBuilder にアクセス トークン ファクトリを提供することで、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して RxJavaSingle<String> を指定します。 Single.defer を呼び出すと、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

タイムアウトとキープアライブのオプションを構成する

タイムアウトとキープアライブ動作を構成するための追加のオプションは、 HubConnection オブジェクト自体で使用できます。

選択肢 既定値 説明
ServerTimeout 30 秒 (30,000 ミリ秒) サーバー アクティビティのタイムアウト。 サーバーがこの間隔でメッセージを送信していない場合、クライアントはサーバーが切断されたと見なし、 Closed イベント (JavaScript でonclose ) をトリガーします。 この値は、ping メッセージがサーバーから送信 され、 タイムアウト期間内にクライアントによって受信されるのに十分な大きさである必要があります。 推奨される値は、ping が到着する時間を許可するサーバーの KeepAliveInterval 値の少なくとも 2 倍の数値です。
HandshakeTimeout 15 秒 初期サーバー ハンドシェイクのタイムアウト。 サーバーがこの間隔でハンドシェイク応答を送信しない場合、クライアントはハンドシェイクをキャンセルし、 Closed イベント (JavaScript でonclose ) をトリガーします。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 クライアントが ping メッセージを送信する間隔を決定します。 クライアントからメッセージを送信すると、タイマーが間隔の開始にリセットされます。 クライアントがサーバー上の ClientTimeoutInterval セットでメッセージを送信していない場合、サーバーはクライアントが切断されたと見なします。

.NET クライアントでは、タイムアウト値は TimeSpan 値として指定されます。

追加のオプションの構成

追加のオプションは、WithUrlwithUrl (JavaScript のHubConnectionBuilder) メソッド、または Java クライアントのHttpHubConnectionBuilderのさまざまな構成 API で構成できます。

.NET オプション 既定値 説明
AccessTokenProvider null HTTP 要求でベアラー認証トークンとして提供される文字列を返す関数。
SkipNegotiation false これを true に設定してネゴシエーション手順をスキップします。 WebSocket トランスポートが唯一有効なトランスポートである場合にのみサポートされます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。
ClientCertificates 空っぽ 認証要求に送信する TLS 証明書のコレクション。
Cookies 空っぽ すべての HTTP 要求で送信する HTTP Cookie のコレクション。
Credentials 空っぽ すべての HTTP 要求で送信する資格情報。
CloseTimeout 5 秒 WebSocket のみ。 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。
Headers 空っぽ すべての HTTP 要求で送信する追加の HTTP ヘッダーのマップ。
HttpMessageHandlerFactory null HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 WebSocket 接続には使用されません。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返します。 ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合、構成されたオプション (Cookie やヘッダーなど) は新しいハンドラーには適用されません。
Proxy null HTTP 要求を送信するときに使用する HTTP プロキシ。
UseDefaultCredentials false HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 これにより、Windows 認証を使用できるようになります。
WebSocketConfiguration null 追加の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。

.NET クライアントでは、これらのオプションは、 WithUrlに提供されるオプション デリゲートによって変更できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript クライアントでは、次のオプションを、 withUrlに提供される JavaScript オブジェクトで指定できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Java クライアントでは、これらのオプションは、HttpHubConnectionBuilder から返される HubConnectionBuilder.create("HUB URL") でメソッドを使用して構成できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

その他のリソース

JSON/MessagePack シリアル化オプション

ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSONMessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。

JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。 AddJsonProtocolは、AddSignalRStartup.ConfigureServicesした後に追加できます。 AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください

たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Startup.ConfigureServices 内で次のコードを使用します。

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。

Newtonsoft.Json に切り替える

Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。

MessagePack シリアル化オプション

MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。

現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。

サーバー オプションを構成する

次の表では、 SignalR ハブを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ClientTimeoutInterval 30 秒 サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。
HandshakeTimeout 15 秒 クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。 KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。
SupportedProtocols インストールされているすべてのプロトコル このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。
EnableDetailedErrors false true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。
StreamBufferCapacity 10 クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。
MaximumReceiveMessageSize 32 KB 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。

AddSignalRStartup.ConfigureServices呼び出しに委任するオプションを指定することで、すべてのハブに対してオプションを構成できます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

単一ハブのオプションは、 AddSignalR で提供されるグローバル オプションをオーバーライドし、 AddHubOptionsを使用して構成できます。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高度な HTTP 構成オプション

HttpConnectionDispatcherOptionsを使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubStartup.Configureにデリゲートを渡すことによって構成されます。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

次の表では、ASP.NET Core SignalR の高度な HTTP オプションを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ApplicationMaxBufferSize 32 KB バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより迅速に受信できますが、メモリ消費量が増加する可能性があります。
AuthorizationData Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。
TransportMaxBufferSize 32 KB バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより迅速にバッファリングできますが、メモリ消費量が増加する可能性があります。
Transports すべてのトランスポートが有効になっています。 クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。
LongPolling 以下を参照してください。 ロングポーリング トランスポートに固有の追加オプション。
WebSockets 以下を参照してください。 WebSocket トランスポートに固有の追加オプション。

Long Polling トランスポートには、 LongPolling プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
PollTimeout 90 秒 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。

WebSocket トランスポートには、 WebSockets プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
CloseTimeout 5 秒 サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。
SubProtocolSelector null Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。

クライアント オプションを構成する

クライアント オプションは、 HubConnectionBuilder の種類 (.NET および JavaScript クライアントで使用可能) で構成できます。 Java クライアントでも使用できますが、 HttpHubConnectionBuilder サブクラスにはビルダー構成オプションと、 HubConnection 自体が含まれています。

ログ記録の構成

ログ記録は、 ConfigureLogging メソッドを使用して .NET クライアントで構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、 ASP.NET Core のログ記録 に関するドキュメントを参照してください。

ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 完全な一覧については、ドキュメント の組み込みログ プロバイダー のセクションを参照してください。

たとえば、コンソールのログ記録を有効にするには、 Microsoft.Extensions.Logging.Console NuGet パッケージをインストールします。 AddConsole拡張メソッドを呼び出します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript クライアントには、同様の configureLogging メソッドが存在します。 生成するログ メッセージの最小レベルを示す LogLevel 値を指定します。 ログはブラウザー コンソール ウィンドウに書き込まれます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel値の代わりに、ログ レベル名を表すstring値を指定することもできます。 これは、SignalR定数にアクセスできない環境でLogLevelログ記録を構成する場合に便利です。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

次の表に、使用可能なログ レベルを示します。 configureLoggingに指定する値は、ログに記録される最小ログ レベルを設定します。 このレベルでログに記録されたメッセージ 、またはテーブルの後に一覧表示されているレベルがログに記録されます。

LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info 又はinformation LogLevel.Information
warn 又はwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

ログ記録を完全に無効にするには、signalR.LogLevel.None メソッドでconfigureLoggingを指定します。

ログ記録の詳細については、 SignalR 診断のドキュメントを参照してください

SignalR Java クライアントは、ログ記録に SLF4J ライブラリを使用します。 これは、ライブラリのユーザーが特定のログの依存関係を取り込むことによって、独自の特定のログ実装を選択できるようにする、高レベルのログ記録 API です。 次のコード スニペットは、java.util.logging Java クライアントでSignalRを使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係のログ記録を構成しない場合、SLF4J は、次の警告メッセージを含む既定の操作なしロガーを読み込みます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

許可されるトランスポートを構成する

SignalRによって使用されるトランスポートは、WithUrl呼び出し (JavaScript のwithUrl) で構成できます。 HttpTransportTypeの値のビットごとの OR を使用して、指定されたトランスポートのみを使用するようにクライアントを制限できます。 既定では、すべてのトランスポートが有効になっています。

たとえば、Server-Sent イベント トランスポートを無効にし、WebSocket 接続と Long Polling 接続を許可するには、次のようにします。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript クライアントでは、トランスポートは、transportに指定された options オブジェクトの withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

このバージョンの Java クライアント WebSocket は、使用可能な唯一のトランスポートです。

Java クライアントでは、トランスポートはwithTransportHttpHubConnectionBuilder メソッドで選択されます。 Java クライアントは、既定で WebSocket トランスポートを使用します。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

SignalR Java クライアントでは、トランスポート フォールバックはまだサポートされていません。

ベアラー認証を構成する

SignalR要求と共に認証データを提供するには、AccessTokenProvider オプション (JavaScript のaccessTokenFactory) を使用して、目的のアクセス トークンを返す関数を指定します。 .NET クライアントでは、このアクセス トークンは HTTP "ベアラー認証" トークンとして渡されます (Authorization型の Bearer ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンはベアラー トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSockets 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。

.NET クライアントでは、AccessTokenProviderの options デリゲートを使用して、WithUrl オプションを指定できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript クライアントでは、アクセス トークンは、accessTokenFactoryの options オブジェクトに withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

SignalR Java クライアントでは、HttpHubConnectionBuilder にアクセス トークン ファクトリを提供することで、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して RxJavaSingle<String> を指定します。 Single.defer を呼び出すと、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

タイムアウトとキープアライブのオプションを構成する

タイムアウトとキープアライブ動作を構成するための追加のオプションは、 HubConnection オブジェクト自体で使用できます。

選択肢 既定値 説明
ServerTimeout 30 秒 (30,000 ミリ秒) サーバー アクティビティのタイムアウト。 サーバーがこの間隔でメッセージを送信していない場合、クライアントはサーバーが切断されたと見なし、 Closed イベント (JavaScript でonclose ) をトリガーします。 この値は、ping メッセージがサーバーから送信 され、 タイムアウト期間内にクライアントによって受信されるのに十分な大きさである必要があります。 推奨される値は、ping が到着する時間を許可するサーバーの KeepAliveInterval 値の少なくとも 2 倍の数値です。
HandshakeTimeout 15 秒 初期サーバー ハンドシェイクのタイムアウト。 サーバーがこの間隔でハンドシェイク応答を送信しない場合、クライアントはハンドシェイクをキャンセルし、 Closed イベント (JavaScript でonclose ) をトリガーします。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 クライアントが ping メッセージを送信する間隔を決定します。 クライアントからメッセージを送信すると、タイマーが間隔の開始にリセットされます。 クライアントがサーバー上の ClientTimeoutInterval セットでメッセージを送信していない場合、サーバーはクライアントが切断されたと見なします。

.NET クライアントでは、タイムアウト値は TimeSpan 値として指定されます。

追加のオプションの構成

追加のオプションは、WithUrlwithUrl (JavaScript のHubConnectionBuilder) メソッド、または Java クライアントのHttpHubConnectionBuilderのさまざまな構成 API で構成できます。

.NET オプション 既定値 説明
AccessTokenProvider null HTTP 要求でベアラー認証トークンとして提供される文字列を返す関数。
SkipNegotiation false これを true に設定してネゴシエーション手順をスキップします。 WebSocket トランスポートが唯一有効なトランスポートである場合にのみサポートされます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。
ClientCertificates 空っぽ 認証要求に送信する TLS 証明書のコレクション。
Cookies 空っぽ すべての HTTP 要求で送信する HTTP Cookie のコレクション。
Credentials 空っぽ すべての HTTP 要求で送信する資格情報。
CloseTimeout 5 秒 WebSocket のみ。 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。
Headers 空っぽ すべての HTTP 要求で送信する追加の HTTP ヘッダーのマップ。
HttpMessageHandlerFactory null HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 WebSocket 接続には使用されません。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返します。 ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合、構成されたオプション (Cookie やヘッダーなど) は新しいハンドラーには適用されません。
Proxy null HTTP 要求を送信するときに使用する HTTP プロキシ。
UseDefaultCredentials false HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 これにより、Windows 認証を使用できるようになります。
WebSocketConfiguration null 追加の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。

.NET クライアントでは、これらのオプションは、 WithUrlに提供されるオプション デリゲートによって変更できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript クライアントでは、次のオプションを、 withUrlに提供される JavaScript オブジェクトで指定できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Java クライアントでは、これらのオプションは、HttpHubConnectionBuilder から返される HubConnectionBuilder.create("HUB URL") でメソッドを使用して構成できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

その他のリソース

JSON/MessagePack シリアル化オプション

ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSONMessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。

JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。 AddJsonProtocolは、AddSignalRStartup.ConfigureServicesした後に追加できます。 AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください

たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Startup.ConfigureServices 内で次のコードを使用します。

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null
    });

.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。

Newtonsoft.Json に切り替える

Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。

MessagePack シリアル化オプション

MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。

現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。

サーバー オプションを構成する

次の表では、 SignalR ハブを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ClientTimeoutInterval 30 秒 サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。
HandshakeTimeout 15 秒 クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。 KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。
SupportedProtocols インストールされているすべてのプロトコル このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。
EnableDetailedErrors false true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。
StreamBufferCapacity 10 クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。
MaximumReceiveMessageSize 32 KB 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。

AddSignalRStartup.ConfigureServices呼び出しに委任するオプションを指定することで、すべてのハブに対してオプションを構成できます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

単一ハブのオプションは、 AddSignalR で提供されるグローバル オプションをオーバーライドし、 AddHubOptionsを使用して構成できます。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高度な HTTP 構成オプション

HttpConnectionDispatcherOptionsを使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubStartup.Configureにデリゲートを渡すことによって構成されます。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

次の表では、ASP.NET Core SignalR の高度な HTTP オプションを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ApplicationMaxBufferSize 32 KB バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより迅速に受信できますが、メモリ消費量が増加する可能性があります。
AuthorizationData Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。
TransportMaxBufferSize 32 KB バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより迅速にバッファリングできますが、メモリ消費量が増加する可能性があります。
Transports すべてのトランスポートが有効になっています。 クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。
LongPolling 以下を参照してください。 ロングポーリング トランスポートに固有の追加オプション。
WebSockets 以下を参照してください。 WebSocket トランスポートに固有の追加オプション。
MinimumProtocolVersion 0 ネゴシエート プロトコルの最小バージョンを指定します。 これは、クライアントを新しいバージョンに制限するために使用されます。

Long Polling トランスポートには、 LongPolling プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
PollTimeout 90 秒 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。

WebSocket トランスポートには、 WebSockets プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
CloseTimeout 5 秒 サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。
SubProtocolSelector null Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。

クライアント オプションを構成する

クライアント オプションは、 HubConnectionBuilder の種類 (.NET および JavaScript クライアントで使用可能) で構成できます。 Java クライアントでも使用できますが、 HttpHubConnectionBuilder サブクラスにはビルダー構成オプションと、 HubConnection 自体が含まれています。

ログ記録の構成

ログ記録は、 ConfigureLogging メソッドを使用して .NET クライアントで構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、 ASP.NET Core のログ記録 に関するドキュメントを参照してください。

ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 完全な一覧については、ドキュメント の組み込みログ プロバイダー のセクションを参照してください。

たとえば、コンソールのログ記録を有効にするには、 Microsoft.Extensions.Logging.Console NuGet パッケージをインストールします。 AddConsole拡張メソッドを呼び出します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript クライアントには、同様の configureLogging メソッドが存在します。 生成するログ メッセージの最小レベルを示す LogLevel 値を指定します。 ログはブラウザー コンソール ウィンドウに書き込まれます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel値の代わりに、ログ レベル名を表すstring値を指定することもできます。 これは、SignalR定数にアクセスできない環境でLogLevelログ記録を構成する場合に便利です。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

次の表に、使用可能なログ レベルを示します。 configureLoggingに指定する値は、ログに記録される最小ログ レベルを設定します。 このレベルでログに記録されたメッセージ 、またはテーブルの後に一覧表示されているレベルがログに記録されます。

LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info 又はinformation LogLevel.Information
warn 又はwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

ログ記録を完全に無効にするには、signalR.LogLevel.None メソッドでconfigureLoggingを指定します。

ログ記録の詳細については、 SignalR 診断のドキュメントを参照してください

SignalR Java クライアントは、ログ記録に SLF4J ライブラリを使用します。 これは、ライブラリのユーザーが特定のログの依存関係を取り込むことによって、独自の特定のログ実装を選択できるようにする、高レベルのログ記録 API です。 次のコード スニペットは、java.util.logging Java クライアントでSignalRを使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係のログ記録を構成しない場合、SLF4J は、次の警告メッセージを含む既定の操作なしロガーを読み込みます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

許可されるトランスポートを構成する

SignalRによって使用されるトランスポートは、WithUrl呼び出し (JavaScript のwithUrl) で構成できます。 HttpTransportTypeの値のビットごとの OR を使用して、指定されたトランスポートのみを使用するようにクライアントを制限できます。 既定では、すべてのトランスポートが有効になっています。

たとえば、Server-Sent イベント トランスポートを無効にし、WebSocket 接続と Long Polling 接続を許可するには、次のようにします。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript クライアントでは、トランスポートは、transportに指定された options オブジェクトの withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

このバージョンの Java クライアント WebSocket は、使用可能な唯一のトランスポートです。

Java クライアントでは、トランスポートはwithTransportHttpHubConnectionBuilder メソッドで選択されます。 Java クライアントは、既定で WebSocket トランスポートを使用します。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

SignalR Java クライアントでは、トランスポート フォールバックはまだサポートされていません。

ベアラー認証を構成する

SignalR要求と共に認証データを提供するには、AccessTokenProvider オプション (JavaScript のaccessTokenFactory) を使用して、目的のアクセス トークンを返す関数を指定します。 .NET クライアントでは、このアクセス トークンは HTTP "ベアラー認証" トークンとして渡されます (Authorization型の Bearer ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンはベアラー トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSockets 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。

.NET クライアントでは、AccessTokenProviderの options デリゲートを使用して、WithUrl オプションを指定できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript クライアントでは、アクセス トークンは、accessTokenFactoryの options オブジェクトに withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

SignalR Java クライアントでは、HttpHubConnectionBuilder にアクセス トークン ファクトリを提供することで、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して RxJavaSingle<String> を指定します。 Single.defer を呼び出すと、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

タイムアウトとキープアライブのオプションを構成する

タイムアウトとキープアライブ動作を構成するための追加のオプションは、 HubConnection オブジェクト自体で使用できます。

選択肢 既定値 説明
ServerTimeout 30 秒 (30,000 ミリ秒) サーバー アクティビティのタイムアウト。 サーバーがこの間隔でメッセージを送信していない場合、クライアントはサーバーが切断されたと見なし、 Closed イベント (JavaScript でonclose ) をトリガーします。 この値は、ping メッセージがサーバーから送信 され、 タイムアウト期間内にクライアントによって受信されるのに十分な大きさである必要があります。 推奨される値は、ping が到着する時間を許可するサーバーの KeepAliveInterval 値の少なくとも 2 倍の数値です。
HandshakeTimeout 15 秒 初期サーバー ハンドシェイクのタイムアウト。 サーバーがこの間隔でハンドシェイク応答を送信しない場合、クライアントはハンドシェイクをキャンセルし、 Closed イベント (JavaScript でonclose ) をトリガーします。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 クライアントが ping メッセージを送信する間隔を決定します。 クライアントからメッセージを送信すると、タイマーが間隔の開始にリセットされます。 クライアントがサーバー上の ClientTimeoutInterval セットでメッセージを送信していない場合、サーバーはクライアントが切断されたと見なします。

.NET クライアントでは、タイムアウト値は TimeSpan 値として指定されます。

追加のオプションの構成

追加のオプションは、WithUrlwithUrl (JavaScript のHubConnectionBuilder) メソッド、または Java クライアントのHttpHubConnectionBuilderのさまざまな構成 API で構成できます。

.NET オプション 既定値 説明
AccessTokenProvider null HTTP 要求でベアラー認証トークンとして提供される文字列を返す関数。
SkipNegotiation false これを true に設定してネゴシエーション手順をスキップします。 WebSocket トランスポートが唯一有効なトランスポートである場合にのみサポートされます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。
ClientCertificates 空っぽ 認証要求に送信する TLS 証明書のコレクション。
Cookies 空っぽ すべての HTTP 要求で送信する HTTP Cookie のコレクション。
Credentials 空っぽ すべての HTTP 要求で送信する資格情報。
CloseTimeout 5 秒 WebSocket のみ。 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。
Headers 空っぽ すべての HTTP 要求で送信する追加の HTTP ヘッダーのマップ。
HttpMessageHandlerFactory null HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 WebSocket 接続には使用されません。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返します。 ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合、構成されたオプション (Cookie やヘッダーなど) は新しいハンドラーには適用されません。
Proxy null HTTP 要求を送信するときに使用する HTTP プロキシ。
UseDefaultCredentials false HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 これにより、Windows 認証を使用できるようになります。
WebSocketConfiguration null 追加の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。

.NET クライアントでは、これらのオプションは、 WithUrlに提供されるオプション デリゲートによって変更できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript クライアントでは、次のオプションを、 withUrlに提供される JavaScript オブジェクトで指定できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

Java クライアントでは、これらのオプションは、HttpHubConnectionBuilder から返される HubConnectionBuilder.create("HUB URL") でメソッドを使用して構成できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

その他のリソース

JSON/MessagePack シリアル化オプション

ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSONMessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。

JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。 AddJsonProtocolは、AddSignalRStartup.ConfigureServicesした後に追加できます。 AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください

たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Startup.ConfigureServices 内で次のコードを使用します。

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。

Newtonsoft.Json に切り替える

Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。

MessagePack シリアル化オプション

MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。

現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。

サーバー オプションを構成する

次の表では、 SignalR ハブを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ClientTimeoutInterval 30 秒 サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。
HandshakeTimeout 15 秒 クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。 KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。
SupportedProtocols インストールされているすべてのプロトコル このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。
EnableDetailedErrors false true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。
StreamBufferCapacity 10 クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。
MaximumReceiveMessageSize 32 KB 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。
MaximumParallelInvocationsPerClient 1 キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。

AddSignalRStartup.ConfigureServices呼び出しに委任するオプションを指定することで、すべてのハブに対してオプションを構成できます。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

単一ハブのオプションは、 AddSignalR で提供されるグローバル オプションをオーバーライドし、 AddHubOptionsを使用して構成できます。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高度な HTTP 構成オプション

HttpConnectionDispatcherOptionsを使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubStartup.Configureにデリゲートを渡すことによって構成されます。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

次の表では、ASP.NET Core SignalR の高度な HTTP オプションを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ApplicationMaxBufferSize 32 KB バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより迅速に受信できますが、メモリ消費量が増加する可能性があります。
AuthorizationData Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。
TransportMaxBufferSize 32 KB バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより迅速にバッファリングできますが、メモリ消費量が増加する可能性があります。
Transports すべてのトランスポートが有効になっています。 クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。
LongPolling 以下を参照してください。 ロングポーリング トランスポートに固有の追加オプション。
WebSockets 以下を参照してください。 WebSocket トランスポートに固有の追加オプション。
MinimumProtocolVersion 0 ネゴシエート プロトコルの最小バージョンを指定します。 これは、クライアントを新しいバージョンに制限するために使用されます。

Long Polling トランスポートには、 LongPolling プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
PollTimeout 90 秒 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。

WebSocket トランスポートには、 WebSockets プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
CloseTimeout 5 秒 サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。
SubProtocolSelector null Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。

クライアント オプションを構成する

クライアント オプションは、 HubConnectionBuilder の種類 (.NET および JavaScript クライアントで使用可能) で構成できます。 Java クライアントでも使用できますが、 HttpHubConnectionBuilder サブクラスにはビルダー構成オプションと、 HubConnection 自体が含まれています。

ログ記録の構成

ログ記録は、 ConfigureLogging メソッドを使用して .NET クライアントで構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、 ASP.NET Core のログ記録 に関するドキュメントを参照してください。

ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 完全な一覧については、ドキュメント の組み込みログ プロバイダー のセクションを参照してください。

たとえば、コンソールのログ記録を有効にするには、 Microsoft.Extensions.Logging.Console NuGet パッケージをインストールします。 AddConsole拡張メソッドを呼び出します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript クライアントには、同様の configureLogging メソッドが存在します。 生成するログ メッセージの最小レベルを示す LogLevel 値を指定します。 ログはブラウザー コンソール ウィンドウに書き込まれます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel値の代わりに、ログ レベル名を表すstring値を指定することもできます。 これは、SignalR定数にアクセスできない環境でLogLevelログ記録を構成する場合に便利です。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

次の表に、使用可能なログ レベルを示します。 configureLoggingに指定する値は、ログに記録される最小ログ レベルを設定します。 このレベルでログに記録されたメッセージ 、またはテーブルの後に一覧表示されているレベルがログに記録されます。

LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info 又はinformation LogLevel.Information
warn 又はwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

ログ記録を完全に無効にするには、signalR.LogLevel.None メソッドでconfigureLoggingを指定します。

ログ記録の詳細については、 SignalR 診断のドキュメントを参照してください

SignalR Java クライアントは、ログ記録に SLF4J ライブラリを使用します。 これは、ライブラリのユーザーが特定のログの依存関係を取り込むことによって、独自の特定のログ実装を選択できるようにする、高レベルのログ記録 API です。 次のコード スニペットは、java.util.logging Java クライアントでSignalRを使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係のログ記録を構成しない場合、SLF4J は、次の警告メッセージを含む既定の操作なしロガーを読み込みます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

許可されるトランスポートを構成する

SignalRによって使用されるトランスポートは、WithUrl呼び出し (JavaScript のwithUrl) で構成できます。 HttpTransportTypeの値のビットごとの OR を使用して、指定されたトランスポートのみを使用するようにクライアントを制限できます。 既定では、すべてのトランスポートが有効になっています。

たとえば、Server-Sent イベント トランスポートを無効にし、WebSocket 接続と Long Polling 接続を許可するには、次のようにします。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript クライアントでは、トランスポートは、transportに指定された options オブジェクトの withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

このバージョンの Java クライアント WebSocket は、使用可能な唯一のトランスポートです。

Java クライアントでは、トランスポートはwithTransportHttpHubConnectionBuilder メソッドで選択されます。 Java クライアントは、既定で WebSocket トランスポートを使用します。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

SignalR Java クライアントでは、トランスポート フォールバックはまだサポートされていません。

ベアラー認証を構成する

SignalR要求と共に認証データを提供するには、AccessTokenProvider オプション (JavaScript のaccessTokenFactory) を使用して、目的のアクセス トークンを返す関数を指定します。 .NET クライアントでは、このアクセス トークンは HTTP "ベアラー認証" トークンとして渡されます (Authorization型の Bearer ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンはベアラー トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSockets 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。

.NET クライアントでは、AccessTokenProviderの options デリゲートを使用して、WithUrl オプションを指定できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript クライアントでは、アクセス トークンは、accessTokenFactoryの options オブジェクトに withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

SignalR Java クライアントでは、HttpHubConnectionBuilder にアクセス トークン ファクトリを提供することで、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して RxJavaSingle<String> を指定します。 Single.defer を呼び出すと、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

タイムアウトとキープアライブのオプションを構成する

タイムアウトとキープアライブ動作を構成するための追加のオプションは、 HubConnection オブジェクト自体で使用できます。

選択肢 既定値 説明
ServerTimeout 30 秒 (30,000 ミリ秒) サーバー アクティビティのタイムアウト。 サーバーがこの間隔でメッセージを送信していない場合、クライアントはサーバーが切断されたと見なし、 Closed イベント (JavaScript でonclose ) をトリガーします。 この値は、ping メッセージがサーバーから送信 され、 タイムアウト期間内にクライアントによって受信されるのに十分な大きさである必要があります。 推奨される値は、ping が到着する時間を許可するサーバーの KeepAliveInterval 値の少なくとも 2 倍の数値です。
HandshakeTimeout 15 秒 初期サーバー ハンドシェイクのタイムアウト。 サーバーがこの間隔でハンドシェイク応答を送信しない場合、クライアントはハンドシェイクをキャンセルし、 Closed イベント (JavaScript でonclose ) をトリガーします。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 クライアントが ping メッセージを送信する間隔を決定します。 クライアントからメッセージを送信すると、タイマーが間隔の開始にリセットされます。 クライアントがサーバー上の ClientTimeoutInterval セットでメッセージを送信していない場合、サーバーはクライアントが切断されたと見なします。

.NET クライアントでは、タイムアウト値は TimeSpan 値として指定されます。

追加のオプションの構成

追加のオプションは、WithUrlwithUrl (JavaScript のHubConnectionBuilder) メソッド、または Java クライアントのHttpHubConnectionBuilderのさまざまな構成 API で構成できます。

.NET オプション 既定値 説明
AccessTokenProvider null HTTP 要求でベアラー認証トークンとして提供される文字列を返す関数。
SkipNegotiation false これを true に設定してネゴシエーション手順をスキップします。 WebSocket トランスポートが唯一有効なトランスポートである場合にのみサポートされます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。
ClientCertificates 空っぽ 認証要求に送信する TLS 証明書のコレクション。
Cookies 空っぽ すべての HTTP 要求で送信する HTTP Cookie のコレクション。
Credentials 空っぽ すべての HTTP 要求で送信する資格情報。
CloseTimeout 5 秒 WebSocket のみ。 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。
Headers 空っぽ すべての HTTP 要求で送信する追加の HTTP ヘッダーのマップ。
HttpMessageHandlerFactory null HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 WebSocket 接続には使用されません。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返します。 ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合、構成されたオプション (Cookie やヘッダーなど) は新しいハンドラーには適用されません。
Proxy null HTTP 要求を送信するときに使用する HTTP プロキシ。
UseDefaultCredentials false HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 これにより、Windows 認証を使用できるようになります。
WebSocketConfiguration null 追加の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。

.NET クライアントでは、これらのオプションは、 WithUrlに提供されるオプション デリゲートによって変更できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript クライアントでは、次のオプションを、 withUrlに提供される JavaScript オブジェクトで指定できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Java クライアントでは、これらのオプションは、HttpHubConnectionBuilder から返される HubConnectionBuilder.create("HUB URL") でメソッドを使用して構成できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

その他のリソース

JSON/MessagePack シリアル化オプション

ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSONMessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。

JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。 AddJsonProtocolは、AddSignalRProgram.csした後に追加できます。 AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください

たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Program.cs 内で次のコードを使用します。

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。

Newtonsoft.Json に切り替える

Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。

MessagePack シリアル化オプション

MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。

現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。

サーバー オプションを構成する

次の表では、 SignalR ハブを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ClientTimeoutInterval 30 秒 サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。
HandshakeTimeout 15 秒 クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。 KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。
SupportedProtocols インストールされているすべてのプロトコル このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。
EnableDetailedErrors false true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。
StreamBufferCapacity 10 クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。
MaximumReceiveMessageSize 32 KB 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。
MaximumParallelInvocationsPerClient 1 キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。

AddSignalRProgram.cs呼び出しに委任するオプションを指定することで、すべてのハブに対してオプションを構成できます。

builder.Services.AddSignalR(hubOptions =>
{
    hubOptions.EnableDetailedErrors = true;
    hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});

単一ハブのオプションは、 AddSignalR で提供されるグローバル オプションをオーバーライドし、 AddHubOptionsを使用して構成できます。

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高度な HTTP 構成オプション

HttpConnectionDispatcherOptionsを使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubProgram.csにデリゲートを渡すことによって構成されます。

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

次の表では、ASP.NET Core SignalR の高度な HTTP オプションを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ApplicationMaxBufferSize 64 KB バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。
TransportMaxBufferSize 64 KB バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。
AuthorizationData Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。
Transports すべてのトランスポートが有効になっています。 クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。
LongPolling 以下を参照してください。 ロングポーリング トランスポートに固有の追加オプション。
WebSockets 以下を参照してください。 WebSocket トランスポートに固有の追加オプション。
MinimumProtocolVersion 0 ネゴシエート プロトコルの最小バージョンを指定します。 これは、クライアントを新しいバージョンに制限するために使用されます。
CloseOnAuthenticationExpiration 偽り トークンの有効期限が切れたときに接続を閉じる認証の有効期限の追跡を有効にするには、このオプションを設定します。

Long Polling トランスポートには、 LongPolling プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
PollTimeout 90 秒 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。

WebSocket トランスポートには、 WebSockets プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
CloseTimeout 5 秒 サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。
SubProtocolSelector null Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。

クライアント オプションを構成する

クライアント オプションは、 HubConnectionBuilder の種類 (.NET および JavaScript クライアントで使用可能) で構成できます。 Java クライアントでも使用できますが、 HttpHubConnectionBuilder サブクラスにはビルダー構成オプションと、 HubConnection 自体が含まれています。

ログ記録の構成

ログ記録は、 ConfigureLogging メソッドを使用して .NET クライアントで構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、 ASP.NET Core のログ記録 に関するドキュメントを参照してください。

ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 完全な一覧については、ドキュメント の組み込みログ プロバイダー のセクションを参照してください。

たとえば、コンソールのログ記録を有効にするには、 Microsoft.Extensions.Logging.Console NuGet パッケージをインストールします。 AddConsole拡張メソッドを呼び出します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript クライアントには、同様の configureLogging メソッドが存在します。 生成するログ メッセージの最小レベルを示す LogLevel 値を指定します。 ログはブラウザー コンソール ウィンドウに書き込まれます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel値の代わりに、ログ レベル名を表すstring値を指定することもできます。 これは、SignalR定数にアクセスできない環境でLogLevelログ記録を構成する場合に便利です。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

次の表に、使用可能なログ レベルを示します。 configureLoggingに指定する値は、ログに記録される最小ログ レベルを設定します。 このレベルでログに記録されたメッセージ 、またはテーブルの後に一覧表示されているレベルがログに記録されます。

LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info 又はinformation LogLevel.Information
warn 又はwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

ログ記録を完全に無効にするには、signalR.LogLevel.None メソッドでconfigureLoggingを指定します。

ログ記録の詳細については、 SignalR 診断のドキュメントを参照してください

SignalR Java クライアントは、ログ記録に SLF4J ライブラリを使用します。 これは、ライブラリのユーザーが特定のログの依存関係を取り込むことによって、独自の特定のログ実装を選択できるようにする、高レベルのログ記録 API です。 次のコード スニペットは、java.util.logging Java クライアントでSignalRを使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係のログ記録を構成しない場合、SLF4J は、次の警告メッセージを含む既定の操作なしロガーを読み込みます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

許可されるトランスポートを構成する

SignalRによって使用されるトランスポートは、WithUrl呼び出し (JavaScript のwithUrl) で構成できます。 HttpTransportTypeの値のビットごとの OR を使用して、指定されたトランスポートのみを使用するようにクライアントを制限できます。 既定では、すべてのトランスポートが有効になっています。

たとえば、Server-Sent イベント トランスポートを無効にし、WebSocket 接続と Long Polling 接続を許可するには、次のようにします。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript クライアントでは、トランスポートは、transportに指定された options オブジェクトの withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

このバージョンの Java クライアント WebSocket は、使用可能な唯一のトランスポートです。

Java クライアントでは、トランスポートはwithTransportHttpHubConnectionBuilder メソッドで選択されます。 Java クライアントは、既定で WebSocket トランスポートを使用します。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

SignalR Java クライアントでは、トランスポート フォールバックはまだサポートされていません。

ベアラー認証を構成する

SignalR要求と共に認証データを提供するには、AccessTokenProvider オプション (JavaScript のaccessTokenFactory) を使用して、目的のアクセス トークンを返す関数を指定します。 .NET クライアントでは、このアクセス トークンは HTTP "ベアラー認証" トークンとして渡されます (Authorization型の Bearer ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンはベアラー トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSockets 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。

.NET クライアントでは、AccessTokenProviderの options デリゲートを使用して、WithUrl オプションを指定できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript クライアントでは、アクセス トークンは、accessTokenFactoryの options オブジェクトに withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

SignalR Java クライアントでは、HttpHubConnectionBuilder にアクセス トークン ファクトリを提供することで、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して RxJavaSingle<String> を指定します。 Single.defer を呼び出すと、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

タイムアウトとキープアライブのオプションを構成する

タイムアウトとキープアライブ動作を構成するための追加のオプションは、 HubConnection オブジェクト自体で使用できます。

選択肢 既定値 説明
ServerTimeout 30 秒 (30,000 ミリ秒) サーバー アクティビティのタイムアウト。 サーバーがこの間隔でメッセージを送信していない場合、クライアントはサーバーが切断されたと見なし、 Closed イベント (JavaScript でonclose ) をトリガーします。 この値は、ping メッセージがサーバーから送信 され、 タイムアウト期間内にクライアントによって受信されるのに十分な大きさである必要があります。 推奨される値は、ping が到着する時間を許可するサーバーの KeepAliveInterval 値の少なくとも 2 倍の数値です。
HandshakeTimeout 15 秒 初期サーバー ハンドシェイクのタイムアウト。 サーバーがこの間隔でハンドシェイク応答を送信しない場合、クライアントはハンドシェイクをキャンセルし、 Closed イベント (JavaScript でonclose ) をトリガーします。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 クライアントが ping メッセージを送信する間隔を決定します。 クライアントからメッセージを送信すると、タイマーが間隔の開始にリセットされます。 クライアントがサーバー上の ClientTimeoutInterval セットでメッセージを送信していない場合、サーバーはクライアントが切断されたと見なします。

.NET クライアントでは、タイムアウト値は TimeSpan 値として指定されます。

追加のオプションの構成

追加のオプションは、WithUrlwithUrl (JavaScript のHubConnectionBuilder) メソッド、または Java クライアントのHttpHubConnectionBuilderのさまざまな構成 API で構成できます。

.NET オプション 既定値 説明
AccessTokenProvider null HTTP 要求でベアラー認証トークンとして提供される文字列を返す関数。
SkipNegotiation false これを true に設定してネゴシエーション手順をスキップします。 WebSocket トランスポートが唯一有効なトランスポートである場合にのみサポートされます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。
ClientCertificates 空っぽ 認証要求に送信する TLS 証明書のコレクション。
Cookies 空っぽ すべての HTTP 要求で送信する HTTP Cookie のコレクション。
Credentials 空っぽ すべての HTTP 要求で送信する資格情報。
CloseTimeout 5 秒 WebSocket のみ。 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。
Headers 空っぽ すべての HTTP 要求で送信する追加の HTTP ヘッダーのマップ。
HttpMessageHandlerFactory null HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 WebSocket 接続には使用されません。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返します。 ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合、構成されたオプション (Cookie やヘッダーなど) は新しいハンドラーには適用されません。
Proxy null HTTP 要求を送信するときに使用する HTTP プロキシ。
UseDefaultCredentials false HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 これにより、Windows 認証を使用できるようになります。
WebSocketConfiguration null 追加の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。
ApplicationMaxBufferSize 1 MB クライアントがバックプレッシャーを適用する前に、サーバーから受信するデータをバッファリングする最大バイト数。 この値を大きくすると、クライアントはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。
TransportMaxBufferSize 1 MB バックプレッシャを観測する前にクライアントによってバッファー処理され、ユーザー アプリケーションから送信される最大バイト数。 この値を大きくすると、クライアントはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。

.NET クライアントでは、これらのオプションは、 WithUrlに提供されるオプション デリゲートによって変更できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript クライアントでは、次のオプションを、 withUrlに提供される JavaScript オブジェクトで指定できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Java クライアントでは、これらのオプションは、HttpHubConnectionBuilder から返される HubConnectionBuilder.create("HUB URL") でメソッドを使用して構成できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

その他のリソース

JSON/MessagePack シリアル化オプション

ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSONMessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。

JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。 AddJsonProtocolは、AddSignalRStartup.ConfigureServicesした後に追加できます。 AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください

たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Program.cs 内で次のコードを使用します。

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。

Newtonsoft.Json に切り替える

Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。

MessagePack シリアル化オプション

MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。

現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。

サーバー オプションを構成する

次の表では、 SignalR ハブを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ClientTimeoutInterval 30 秒 サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。
HandshakeTimeout 15 秒 クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。 KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。
SupportedProtocols インストールされているすべてのプロトコル このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。
EnableDetailedErrors false true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。
StreamBufferCapacity 10 クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。
MaximumReceiveMessageSize 32 KB 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。
MaximumParallelInvocationsPerClient 1 キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。
DisableImplicitFromServicesParameters false ハブ メソッドの引数は、可能であれば DI から解決されます。

AddSignalRProgram.cs呼び出しに委任するオプションを指定することで、すべてのハブに対してオプションを構成できます。

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

単一ハブのオプションは、 AddSignalR で提供されるグローバル オプションをオーバーライドし、 AddHubOptionsを使用して構成できます。

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高度な HTTP 構成オプション

HttpConnectionDispatcherOptionsを使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubProgram.csにデリゲートを渡すことによって構成されます。

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

次の表では、ASP.NET Core SignalR の高度な HTTP オプションを構成するためのオプションについて説明します。

選択肢 デフォルト値 説明
ApplicationMaxBufferSize 64 KB バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。
TransportMaxBufferSize 64 KB バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。
AuthorizationData Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。
Transports すべてのトランスポートが有効になっています。 クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。
LongPolling 以下を参照してください。 ロングポーリング トランスポートに固有の追加オプション。
WebSockets 以下を参照してください。 WebSocket トランスポートに固有の追加オプション。
MinimumProtocolVersion 0 ネゴシエート プロトコルの最小バージョンを指定します。 これは、クライアントを新しいバージョンに制限するために使用されます。
CloseOnAuthenticationExpiration 偽り トークンの有効期限が切れたときに接続を閉じる認証の有効期限の追跡を有効にするには、このオプションを設定します。

Long Polling トランスポートには、 LongPolling プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
PollTimeout 90 秒 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。

WebSocket トランスポートには、 WebSockets プロパティを使用して構成できる追加のオプションがあります。

選択肢 デフォルト値 説明
CloseTimeout 5 秒 サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。
SubProtocolSelector null Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。

クライアント オプションを構成する

クライアント オプションは、 HubConnectionBuilder の種類 (.NET および JavaScript クライアントで使用可能) で構成できます。 Java クライアントでも使用できますが、 HttpHubConnectionBuilder サブクラスにはビルダー構成オプションと、 HubConnection 自体が含まれています。

ログ記録の構成

ログ記録は、 ConfigureLogging メソッドを使用して .NET クライアントで構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、 ASP.NET Core のログ記録 に関するドキュメントを参照してください。

ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 完全な一覧については、ドキュメント の組み込みログ プロバイダー のセクションを参照してください。

たとえば、コンソールのログ記録を有効にするには、 Microsoft.Extensions.Logging.Console NuGet パッケージをインストールします。 AddConsole拡張メソッドを呼び出します。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

JavaScript クライアントには、同様の configureLogging メソッドが存在します。 生成するログ メッセージの最小レベルを示す LogLevel 値を指定します。 ログはブラウザー コンソール ウィンドウに書き込まれます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

LogLevel値の代わりに、ログ レベル名を表すstring値を指定することもできます。 これは、SignalR定数にアクセスできない環境でLogLevelログ記録を構成する場合に便利です。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

次の表に、使用可能なログ レベルを示します。 configureLoggingに指定する値は、ログに記録される最小ログ レベルを設定します。 このレベルでログに記録されたメッセージ 、またはテーブルの後に一覧表示されているレベルがログに記録されます。

LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
info 又はinformation LogLevel.Information
warn 又はwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

ログ記録を完全に無効にするには、signalR.LogLevel.None メソッドでconfigureLoggingを指定します。

ログ記録の詳細については、 SignalR 診断のドキュメントを参照してください

SignalR Java クライアントは、ログ記録に SLF4J ライブラリを使用します。 これは、ライブラリのユーザーが特定のログの依存関係を取り込むことによって、独自の特定のログ実装を選択できるようにする、高レベルのログ記録 API です。 次のコード スニペットは、java.util.logging Java クライアントでSignalRを使用する方法を示しています。

implementation 'org.slf4j:slf4j-jdk14:1.7.25'

依存関係のログ記録を構成しない場合、SLF4J は、次の警告メッセージを含む既定の操作なしロガーを読み込みます。

SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
SLF4J: Defaulting to no-operation (NOP) logger implementation
SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

これは無視しても問題ありません。

許可されるトランスポートを構成する

SignalRによって使用されるトランスポートは、WithUrl呼び出し (JavaScript のwithUrl) で構成できます。 HttpTransportTypeの値のビットごとの OR を使用して、指定されたトランスポートのみを使用するようにクライアントを制限できます。 既定では、すべてのトランスポートが有効になっています。

たとえば、Server-Sent イベント トランスポートを無効にし、WebSocket 接続と Long Polling 接続を許可するには、次のようにします。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

JavaScript クライアントでは、トランスポートは、transportに指定された options オブジェクトの withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

このバージョンの Java クライアント WebSocket は、使用可能な唯一のトランスポートです。

Java クライアントでは、トランスポートはwithTransportHttpHubConnectionBuilder メソッドで選択されます。 Java クライアントは、既定で WebSocket トランスポートを使用します。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

SignalR Java クライアントでは、トランスポート フォールバックはまだサポートされていません。

ベアラー認証を構成する

SignalR要求と共に認証データを提供するには、AccessTokenProvider オプション (JavaScript のaccessTokenFactory) を使用して、目的のアクセス トークンを返す関数を指定します。 .NET クライアントでは、このアクセス トークンは HTTP "ベアラー認証" トークンとして渡されます (Authorization型の Bearer ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンはベアラー トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSockets 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。

.NET クライアントでは、AccessTokenProviderの options デリゲートを使用して、WithUrl オプションを指定できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

JavaScript クライアントでは、アクセス トークンは、accessTokenFactoryの options オブジェクトに withUrl フィールドを設定することによって構成されます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

SignalR Java クライアントでは、HttpHubConnectionBuilder にアクセス トークン ファクトリを提供することで、認証に使用するベアラー トークンを構成できます。 withAccessTokenFactory を使用して RxJavaSingle<String> を指定します。 Single.defer を呼び出すと、クライアントのアクセス トークンを生成するロジックを記述できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withAccessTokenProvider(Single.defer(() -> {
        // Your logic here.
        return Single.just("An Access Token");
    })).build();

タイムアウトとキープアライブのオプションを構成する

タイムアウトとキープアライブ動作を構成するための追加のオプションは、 HubConnection オブジェクト自体で使用できます。

選択肢 既定値 説明
ServerTimeout 30 秒 (30,000 ミリ秒) サーバー アクティビティのタイムアウト。 サーバーがこの間隔でメッセージを送信していない場合、クライアントはサーバーが切断されたと見なし、 Closed イベント (JavaScript でonclose ) をトリガーします。 この値は、ping メッセージがサーバーから送信 され、 タイムアウト期間内にクライアントによって受信されるのに十分な大きさである必要があります。 推奨される値は、ping が到着する時間を許可するサーバーの KeepAliveInterval 値の少なくとも 2 倍の数値です。
HandshakeTimeout 15 秒 初期サーバー ハンドシェイクのタイムアウト。 サーバーがこの間隔でハンドシェイク応答を送信しない場合、クライアントはハンドシェイクをキャンセルし、 Closed イベント (JavaScript でonclose ) をトリガーします。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。
KeepAliveInterval 15 秒 クライアントが ping メッセージを送信する間隔を決定します。 クライアントからメッセージを送信すると、タイマーが間隔の開始にリセットされます。 クライアントがサーバー上の ClientTimeoutInterval セットでメッセージを送信していない場合、サーバーはクライアントが切断されたと見なします。

.NET クライアントでは、タイムアウト値は TimeSpan 値として指定されます。

追加のオプションの構成

追加のオプションは、WithUrlwithUrl (JavaScript のHubConnectionBuilder) メソッド、または Java クライアントのHttpHubConnectionBuilderのさまざまな構成 API で構成できます。

.NET オプション 既定値 説明
AccessTokenProvider null HTTP 要求でベアラー認証トークンとして提供される文字列を返す関数。
SkipNegotiation false これを true に設定してネゴシエーション手順をスキップします。 WebSocket トランスポートが唯一有効なトランスポートである場合にのみサポートされます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。
ClientCertificates 空っぽ 認証要求に送信する TLS 証明書のコレクション。
Cookies 空っぽ すべての HTTP 要求で送信する HTTP Cookie のコレクション。
Credentials 空っぽ すべての HTTP 要求で送信する資格情報。
CloseTimeout 5 秒 WebSocket のみ。 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。
Headers 空っぽ すべての HTTP 要求で送信する追加の HTTP ヘッダーのマップ。
HttpMessageHandlerFactory null HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 WebSocket 接続には使用されません。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返します。 ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合、構成されたオプション (Cookie やヘッダーなど) は新しいハンドラーには適用されません。
Proxy null HTTP 要求を送信するときに使用する HTTP プロキシ。
UseDefaultCredentials false HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 これにより、Windows 認証を使用できるようになります。
WebSocketConfiguration null 追加の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。
ApplicationMaxBufferSize 1 MB クライアントがバックプレッシャーを適用する前に、サーバーから受信するデータをバッファリングする最大バイト数。 この値を大きくすると、クライアントはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。
TransportMaxBufferSize 1 MB バックプレッシャを観測する前にクライアントによってバッファー処理され、ユーザー アプリケーションから送信される最大バイト数。 この値を大きくすると、クライアントはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。

.NET クライアントでは、これらのオプションは、 WithUrlに提供されるオプション デリゲートによって変更できます。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

JavaScript クライアントでは、次のオプションを、 withUrlに提供される JavaScript オブジェクトで指定できます。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

Java クライアントでは、これらのオプションは、HttpHubConnectionBuilder から返される HubConnectionBuilder.create("HUB URL") でメソッドを使用して構成できます。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

その他のリソース