この記事では、ASP.NET Core SignalR の構成について説明します。
この記事のガイダンスを追加または置き換える BlazorSignalR ガイダンスについては、 ASP.NET Core BlazorSignalR ガイダンスを参照してください。
JSON/MessagePack シリアル化オプション
ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。
AddJsonProtocol
は、AddSignalRでStartup.ConfigureServices
した後に追加できます。
AddJsonProtocol
メソッドは、options
オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.Json
JsonSerializerOptions オブジェクトです。 詳細については、 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 から解決されます。 |
AddSignalR
でProgram.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
を使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubでProgram.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 クライアントでは、トランスポートはwithTransport
の HttpHubConnectionBuilder
メソッドで選択されます。 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 バイトです。
追加のオプションの構成
追加のオプションは、WithUrl
のwithUrl
(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 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
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 です。 |
AddSignalR
でStartup.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
を使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubでStartup.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
値として指定されます。
追加のオプションの構成
追加のオプションは、WithUrl
のwithUrl
(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 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
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 です。 |
AddSignalR
でStartup.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
を使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubでStartup.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
値として指定されます。
追加のオプションの構成
追加のオプションは、WithUrl
のwithUrl
(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 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。
AddJsonProtocol
は、AddSignalRでStartup.ConfigureServices
した後に追加できます。
AddJsonProtocol
メソッドは、options
オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.Json
JsonSerializerOptions オブジェクトです。 詳細については、 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) 攻撃のリスクが高くなる可能性があります。 |
AddSignalR
でStartup.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
を使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubでStartup.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 クライアントでは、トランスポートはwithTransport
の HttpHubConnectionBuilder
メソッドで選択されます。 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
値として指定されます。
追加のオプションの構成
追加のオプションは、WithUrl
のwithUrl
(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 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。
AddJsonProtocol
は、AddSignalRでStartup.ConfigureServices
した後に追加できます。
AddJsonProtocol
メソッドは、options
オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.Json
JsonSerializerOptions オブジェクトです。 詳細については、 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) 攻撃のリスクが高くなる可能性があります。 |
AddSignalR
でStartup.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
を使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubでStartup.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 クライアントでは、トランスポートはwithTransport
の HttpHubConnectionBuilder
メソッドで選択されます。 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
値として指定されます。
追加のオプションの構成
追加のオプションは、WithUrl
のwithUrl
(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 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。
AddJsonProtocol
は、AddSignalRでStartup.ConfigureServices
した後に追加できます。
AddJsonProtocol
メソッドは、options
オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.Json
JsonSerializerOptions オブジェクトです。 詳細については、 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 | キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。 |
AddSignalR
でStartup.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
を使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubでStartup.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 クライアントでは、トランスポートはwithTransport
の HttpHubConnectionBuilder
メソッドで選択されます。 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
値として指定されます。
追加のオプションの構成
追加のオプションは、WithUrl
のwithUrl
(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 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。
AddJsonProtocol
は、AddSignalRでProgram.cs
した後に追加できます。
AddJsonProtocol
メソッドは、options
オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.Json
JsonSerializerOptions オブジェクトです。 詳細については、 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 | キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。 |
AddSignalR
でProgram.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
を使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubでProgram.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 クライアントでは、トランスポートはwithTransport
の HttpHubConnectionBuilder
メソッドで選択されます。 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
値として指定されます。
追加のオプションの構成
追加のオプションは、WithUrl
のwithUrl
(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 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。
AddJsonProtocol
は、AddSignalRでStartup.ConfigureServices
した後に追加できます。
AddJsonProtocol
メソッドは、options
オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.Json
JsonSerializerOptions オブジェクトです。 詳細については、 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 から解決されます。 |
AddSignalR
でProgram.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
を使用して、トランスポートとメモリ バッファーの管理に関連する詳細設定を構成します。 これらのオプションは、MapHubでProgram.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 クライアントでは、トランスポートはwithTransport
の HttpHubConnectionBuilder
メソッドで選択されます。 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
値として指定されます。
追加のオプションの構成
追加のオプションは、WithUrl
のwithUrl
(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();
その他のリソース
ASP.NET Core