この記事では、ASP.NET Core SignalR のクライアント とサーバーのオプションを構成する方法について説明します。
この記事のガイダンスを追加または置き換える BlazorSignalR ガイダンスについては、 ASP.NET Core BlazorSignalR ガイダンスを参照してください。
メッセージをエンコードするためのシリアル化を構成する
ASP.NET Core SignalR では、メッセージをエンコードするための 2 つのプロトコル ( JSON と MessagePack) がサポートされています。 各プロトコルには、シリアル化構成オプションがあります。
JSON シリアル化オプション
JSON シリアル化は、 AddJsonProtocol 拡張メソッドを使用してサーバーで構成できます。
AddJsonProtocolは、AddSignalR の Startup.ConfigureServices メソッドの後に追加できます。
AddJsonProtocol メソッドは、options オブジェクトを受け取るデリゲートを受け取ります。 そのオブジェクトの PayloadSerializerOptions プロパティは、引数と戻り値のシリアル化を構成するために使用できる System.Text.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください。
たとえば、既定の キャメル ケース 名ではなく、プロパティ名の大文字と小文字を変更しないようにシリアライザーを構成するには、 Program.cs ファイルで次のコードを使用します。
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
注
現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。
Newtonsoft.Json に切り替える
でサポートされていない System.Text.Json パッケージの機能がアプリに必要な場合は、「Switch to 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)、ハブ メソッドで例外がスローされると、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。 |
StreamBufferCapacity |
10 | クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。 |
MaximumReceiveMessageSize |
32 KB | 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。 |
MaximumParallelInvocationsPerClient |
1 | キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。 この制限は、ストリーミング ハブの呼び出しには適用されません。 詳細については、「ASP.NET Core SignalRでハブを使用する」を参照してください。 |
DisableImplicitFromServicesParameters |
false |
ハブ メソッドの引数は、可能であれば依存関係の挿入から解決されます。 |
StatefulReconnectBufferSize |
100,000 バイト | ステートフル 再接続が有効になっている場合に、接続ごとにバッファーに格納される最大バイト数。 ハブ エンドポイントで AllowStatefulReconnects が有効になっていない限り、このオプションは無効です。 詳細については、「ステートフル再接続を構成する」を参照してください。 |
Program.cs AddSignalRの呼び出しに委任されたオプションを指定することで、すべてのハブに対してオプションを構成できます。
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 |
64KB | バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。 |
TransportMaxBufferSize |
64KB | バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。 |
AuthorizationData |
Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 |
クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。 |
Transports |
すべてのトランスポートが有効になっています。 | クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。 |
LongPolling |
Long Polling トランスポートを構成するを参照してください | ロング ポーリング トランスポートに特有のオプション。 |
WebSockets |
WebSocket トランスポートの構成を参照してください | WebSocket トランスポートに固有のオプション。 |
MinimumProtocolVersion |
0 | ネゴシエーション プロトコルの最小バージョン。 この値は、クライアントを新しいバージョンのプロトコルに制限するために使用されます。 |
TransportSendTimeout |
10 秒 | クライアントへの 1 回の送信が完了するまでトランスポートが待機する最大時間。 送信がこのタイムアウトを超えると、接続は閉じられます。 大きなメッセージの送信中に切断される低速または信頼性の低いネットワーク上のクライアントの場合は、この値を増やします。 値を TimeSpan.Zero に設定すると、 ArgumentOutOfRangeExceptionがスローされます。 |
CloseOnAuthenticationExpiration |
false |
トークンの有効期限が切れたときに接続を閉じる認証の有効期限の追跡を制御します。 |
AllowStatefulReconnects |
false |
ステートフル再接続をネゴシエートするクライアントが、一時的なネットワーク中断後に同じ接続 ID を持つ接続を再開できるようにします。 詳細については、「ステートフル再接続を構成する」を参照してください。 |
次の高度な HTTP オプションは、.NET 11 で導入された認証更新SignalR構成します。 認証更新を使用すると、接続されているクライアントは、再接続せずに認証資格情報を更新できます。 詳細については、「 SignalR 認証と承認」を参照してください。
| 選択肢 | 既定値 | 説明 |
|---|---|---|
EnableAuthenticationRefresh |
false |
接続の認証更新を有効にします。 トークンの有効期限が切れる前に更新されない接続が閉じることができるように、 CloseOnAuthenticationExpiration と共に有効にします。 |
MaximumAuthenticationExpiration |
null |
更新されたトークンの有効期限を、更新の時刻を基準にして、今後設定できる期間を上限とします。 また、これを設定すると、有効期限のないトークンに既知の有効期間が与えられます。これにより、自動更新が有効になります。 値は 0 より大きくする必要があり、Windows 認証には適用されません。 |
OnAuthenticationRefresh |
null |
更新の試行ごとに呼び出される省略可能な Func<AuthenticationRefreshContext, Task<bool>> コールバック。 更新を拒否する false を返します。これにより、 /refresh 要求が HTTP 403 応答で失敗します。 このチェックは、更新されたプリンシパルが同じ SignalR ユーザーにマップされるという組み込みの要件に加えて実行されます。 |
ロング ポーリング トランスポートを構成する
Long Polling トランスポートには、 LongPolling プロパティを使用して構成できるその他のオプションがあります。
| 選択肢 | 既定値 | 説明 |
|---|---|---|
PollTimeout |
90 秒 | 1 つのポーリング要求を終了する前に、サーバーがメッセージがクライアントに送信されるのを待機する最大時間。 この値を小さくすると、クライアントは新しいポーリング要求をより頻繁に発行します。 |
WebSocket トランスポートを構成する
WebSocket トランスポートには、 WebSockets プロパティを使用して構成できるその他のオプションがあります。
| 選択肢 | 既定値 | 説明 |
|---|---|---|
CloseTimeout |
5 秒 | サーバーが閉じた後、クライアントがこの時間間隔内で閉じに失敗した場合、接続は終了します。 |
SubProtocolSelector |
null |
Sec-WebSocket-Protocol ヘッダーをカスタム値に設定するために使用できるデリゲート。 デリゲートは、クライアントによって要求された値を入力として受け取り、目的の値を返す必要があります。 |
クライアント オプションを構成する
.NET クライアントと JavaScript クライアントでは、クライアント オプションは HubConnectionBuilder 型で構成されます。 Java クライアントでは、HttpHubConnectionBuilder サブクラスでオプションが構成されます。このサブクラスには、ビルダー構成オプションと HubConnection 自体が含まれます。
ログ記録の構成
.NET クライアントでは、ConfigureLogging メソッドを使用してログ記録が構成されます。 ログ プロバイダーとフィルターは、サーバー上と同じ方法で登録できます。 詳細については、
注
ログ プロバイダーを登録するには、必要なパッケージをインストールする必要があります。 詳細については、 組み込みのログ プロバイダーの完全な一覧を参照してください。
たとえば、コンソールのログ記録を有効にするには、 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 Java クライアントは、ログ記録に Simple Logging Facade for 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 "Bearer 認証" トークンとして渡されます (Bearer型の Authorization ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンは Bearer トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSocket 要求)。 このような場合、アクセス トークンはクエリ文字列値 access_tokenとして提供されます。
.NET クライアントでは、AccessTokenProvider オプションは、WithUrl の options デリゲートを使用して指定できます。
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 に提供することで、認証に使用するベアラー トークンを構成できます。 rxJava を指定するには、< を使用します。 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 (JavaScript では withUrl) メソッドのその他のオプションは、HubConnectionBuilder またはJava クライアントの HttpHubConnectionBuilder 上のさまざまな構成 API で構成できます。
| 選択肢 | 既定値 | 説明 |
|---|---|---|
AccessTokenProvider |
null |
HTTP 要求で Bearer 認証トークンとして提供される文字列を返す関数。 |
SkipNegotiation |
false |
このオプションを true に設定すると、ネゴシエーション手順がスキップされます。 注: このオプションは、WebSocket トランスポートが唯一有効なトランスポートである場合にのみ使用できます。 Azure SignalR サービスを使用している場合、この設定を有効にすることはできません。 |
ClientCertificates |
空っぽ | 認証要求に送信するトランスポート層セキュリティ (TLS) 証明書のコレクション。 |
Cookies |
空っぽ | すべての HTTP 要求で送信する HTTP Cookie のコレクション。 |
Credentials |
空っぽ | すべての HTTP 要求で送信する資格情報。 |
CloseTimeout |
5 秒 | 閉じる要求をサーバーが確認するまで、クライアントが閉じた後に待機する最大時間。 サーバーがこの時間内に終了を確認しない場合、クライアントは切断されます。 注: この設定は WebSocket でのみ使用できます。 |
Headers |
空っぽ | すべての HTTP 要求で送信する他の HTTP ヘッダーのマップ。 |
HttpMessageHandlerFactory |
null |
HTTP 要求の送信に使用する HttpMessageHandler を構成または置換するために使用できるデリゲート。 このデリゲートは null 以外の値を返す必要があり、既定値をパラメーターとして受け取ります。 その既定値の設定を変更して返すか、新しい HttpMessageHandler インスタンスを返すことができます。 注: - ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定を必ずコピーしてください。 それ以外の場合、構成されたオプション ( Cookies やヘッダーなど) は新しいハンドラーには適用されません。 - この設定は WebSocket 接続には使用されません。 |
Proxy |
null |
HTTP 要求を送信するときに使用する HTTP プロキシ。 |
UseDefaultCredentials |
false |
HTTP 要求と WebSocket 要求の既定の資格情報を送信するには、このブール値を設定します。 このオプションを使用すると、Windows 認証を使用できます。 |
WebSocketConfiguration |
null |
その他の WebSocket オプションを構成するために使用できるデリゲート。 オプションの構成に使用できる ClientWebSocketOptions のインスタンスを受け取ります。 |
WebSocketFactory |
null |
WebSocket トランスポートで使用される WebSocket をラップまたは置換するデリゲート。 デリゲートは、解決された接続UriとHttpConnectionOptionsとCancellationTokenを公開するWebSocketConnectionContextを受け取り、接続されたWebSocketを返す必要があります。 注: - このデリゲートを設定すると、クライアントの既定のソケットの作成が置き換えられるため、デリゲートはソケットを接続し、必要なオプション ( WebSocketConfiguration、 Headers、 Cookiesなど) を適用する役割を担います。 - デリゲートから null を返す場合、 InvalidOperationExceptionがスローされます。 |
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();
関連するコンテンツ
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 "Bearer 認証" トークンとして渡されます (Bearerの種類で Authorization ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンは Bearer トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSocket 要求)。 このような場合、アクセス トークンはクエリ文字列値 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 要求で Bearer 認証トークンとして提供される文字列を返す関数。 |
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 インスタンスを返します。
ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合は、構成されたオプション ( Cookies やヘッダーなど) は新しいハンドラーには適用されません。 |
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 "Bearer 認証" トークンとして渡されます (Bearerの種類で Authorization ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンは Bearer トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSocket 要求)。 このような場合、アクセス トークンはクエリ文字列値 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 要求で Bearer 認証トークンとして提供される文字列を返す関数。 |
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 インスタンスを返します。
ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合は、構成されたオプション ( Cookies やヘッダーなど) は新しいハンドラーには適用されません。 |
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.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください。
たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Startup.ConfigureServices 内で次のコードを使用します。
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
注
現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。
Newtonsoft.Json に切り替える
Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。
MessagePack シリアル化オプション
MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。
注
現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。
サーバー オプションを構成する
次の表では、 SignalR ハブを構成するためのオプションについて説明します。
| 選択肢 | デフォルト値 | 説明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。 |
HandshakeTimeout |
15 秒 | クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。 |
KeepAliveInterval |
15 秒 | サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。
KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。 |
SupportedProtocols |
インストールされているすべてのプロトコル | このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。 |
EnableDetailedErrors |
false |
true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。 |
StreamBufferCapacity |
10 |
クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。 |
MaximumReceiveMessageSize |
32 KB | 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。 |
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 "Bearer 認証" トークンとして渡されます (Bearerの種類で Authorization ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンは Bearer トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSocket 要求)。 このような場合、アクセス トークンはクエリ文字列値 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 要求で Bearer 認証トークンとして提供される文字列を返す関数。 |
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 インスタンスを返します。
ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合は、構成されたオプション ( Cookies やヘッダーなど) は新しいハンドラーには適用されません。 |
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.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください。
たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Startup.ConfigureServices 内で次のコードを使用します。
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null
});
.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
注
現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。
Newtonsoft.Json に切り替える
Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。
MessagePack シリアル化オプション
MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。
注
現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。
サーバー オプションを構成する
次の表では、 SignalR ハブを構成するためのオプションについて説明します。
| 選択肢 | デフォルト値 | 説明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。 |
HandshakeTimeout |
15 秒 | クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。 |
KeepAliveInterval |
15 秒 | サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。
KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。 |
SupportedProtocols |
インストールされているすべてのプロトコル | このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。 |
EnableDetailedErrors |
false |
true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。 |
StreamBufferCapacity |
10 |
クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。 |
MaximumReceiveMessageSize |
32 KB | 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。 |
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 "Bearer 認証" トークンとして渡されます (Bearerの種類で Authorization ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンは Bearer トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSocket 要求)。 このような場合、アクセス トークンはクエリ文字列値 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 要求で Bearer 認証トークンとして提供される文字列を返す関数。 |
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 インスタンスを返します。
ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合は、構成されたオプション ( Cookies やヘッダーなど) は新しいハンドラーには適用されません。 |
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.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください。
たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Startup.ConfigureServices 内で次のコードを使用します。
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
注
現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。
Newtonsoft.Json に切り替える
Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。
MessagePack シリアル化オプション
MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。
注
現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。
サーバー オプションを構成する
次の表では、 SignalR ハブを構成するためのオプションについて説明します。
| 選択肢 | デフォルト値 | 説明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。 |
HandshakeTimeout |
15 秒 | クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。 |
KeepAliveInterval |
15 秒 | サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。
KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。 |
SupportedProtocols |
インストールされているすべてのプロトコル | このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。 |
EnableDetailedErrors |
false |
true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。 |
StreamBufferCapacity |
10 |
クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。 |
MaximumReceiveMessageSize |
32 KB | 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。 |
MaximumParallelInvocationsPerClient |
1 | キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。 |
注
MaximumParallelInvocationsPerClient は、ストリーミング ハブの呼び出しには適用されません。 ストリーミング呼び出しは実行時間が長く、同時に実行できる必要があります。
ハブ フィルターを使用して、接続ごとのストリーミングコンカレンシー制限を適用します。
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 "Bearer 認証" トークンとして渡されます (Bearerの種類で Authorization ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンは Bearer トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSocket 要求)。 このような場合、アクセス トークンはクエリ文字列値 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 要求で Bearer 認証トークンとして提供される文字列を返す関数。 |
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 インスタンスを返します。
ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合は、構成されたオプション ( Cookies やヘッダーなど) は新しいハンドラーには適用されません。 |
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.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください。
たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Program.cs 内で次のコードを使用します。
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
注
現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。
Newtonsoft.Json に切り替える
Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。
MessagePack シリアル化オプション
MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。
注
現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。
サーバー オプションを構成する
次の表では、 SignalR ハブを構成するためのオプションについて説明します。
| 選択肢 | デフォルト値 | 説明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。 |
HandshakeTimeout |
15 秒 | クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。 |
KeepAliveInterval |
15 秒 | サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。
KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。 |
SupportedProtocols |
インストールされているすべてのプロトコル | このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。 |
EnableDetailedErrors |
false |
true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。 |
StreamBufferCapacity |
10 |
クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。 |
MaximumReceiveMessageSize |
32 KB | 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。 |
MaximumParallelInvocationsPerClient |
1 | キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。 |
注
MaximumParallelInvocationsPerClient は、ストリーミング ハブの呼び出しには適用されません。 ストリーミング呼び出しは実行時間が長く、同時に実行できる必要があります。
ハブ フィルターを使用して、接続ごとのストリーミングコンカレンシー制限を適用します。
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 |
64KB | バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。 |
TransportMaxBufferSize |
64KB | バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。 |
AuthorizationData |
Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 |
クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。 |
Transports |
すべてのトランスポートが有効になっています。 | クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。 |
LongPolling |
以下を参照してください。 | ロングポーリング トランスポートに固有の追加オプション。 |
WebSockets |
以下を参照してください。 | WebSocket トランスポートに固有の追加オプション。 |
MinimumProtocolVersion |
0 | ネゴシエート プロトコルの最小バージョンを指定します。 これは、クライアントを新しいバージョンに制限するために使用されます。 |
TransportSendTimeout |
10 秒 | クライアントへの 1 回の送信が完了するまでトランスポートが待機する最大時間。 送信がこのタイムアウトを超えると、接続は閉じられます。 |
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 "Bearer 認証" トークンとして渡されます (Bearerの種類で Authorization ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンは Bearer トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSocket 要求)。 このような場合、アクセス トークンはクエリ文字列値 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 要求で Bearer 認証トークンとして提供される文字列を返す関数。 |
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 インスタンスを返します。
ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合は、構成されたオプション ( Cookies やヘッダーなど) は新しいハンドラーには適用されません。 |
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.JsonJsonSerializerOptions オブジェクトです。 詳細については、 System.Text.Json のドキュメントを参照してください。
たとえば、既定のキャメル ケースの名前ではなく、プロパティ名の大文字と小文字の区別を変更しないようにシリアライザーを構成するには、Program.cs 内で次のコードを使用します。
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET クライアントでは、同じ AddJsonProtocol 拡張メソッドが HubConnectionBuilderに存在します。 拡張メソッドを解決するには、 Microsoft.Extensions.DependencyInjection 名前空間をインポートする必要があります。
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
注
現時点では、JavaScript クライアントで JSON シリアル化を構成することはできません。
Newtonsoft.Json に切り替える
Newtonsoft.JsonでサポートされていないSystem.Text.Jsonの機能が必要な場合は、「Newtonsoft.Jsonに切り替える」を参照してください。
MessagePack シリアル化オプション
MessagePack シリアル化は、 AddMessagePackProtocol 呼び出しにデリゲートを提供することで構成できます。 詳細については、SignalRの MessagePack を参照してください。
注
現時点では、JavaScript クライアントで MessagePack シリアル化を構成することはできません。
サーバー オプションを構成する
次の表では、 SignalR ハブを構成するためのオプションについて説明します。
| 選択肢 | デフォルト値 | 説明 |
|---|---|---|
ClientTimeoutInterval |
30 秒 | サーバーは、この間隔でメッセージ (キープアライブを含む) を受信していない場合、クライアントが切断されたと見なします。 この実装方法により、クライアントが切断済みとマークされるまでに、このタイムアウト間隔よりも長い時間がかかる場合があります。 推奨値は、 KeepAliveInterval 値の 2 倍です。 |
HandshakeTimeout |
15 秒 | クライアントがこの時間内に最初のハンドシェイク メッセージを送信しない場合、接続は閉じられます。 これは高度な設定であり、重大なネットワーク待機時間が原因でハンドシェイク タイムアウト エラーが発生している場合にのみ変更する必要があります。 ハンドシェイク プロセスの詳細については、 SignalR Hub プロトコルの仕様を参照してください。 |
KeepAliveInterval |
15 秒 | サーバーがこの時間内にメッセージを送信していない場合は、接続を開いたままにするために ping メッセージが自動的に送信されます。
KeepAliveIntervalを変更するときは、クライアントのServerTimeoutまたはserverTimeoutInMillisecondsの設定を変更します。 推奨される ServerTimeout 値または serverTimeoutInMilliseconds 値は、 KeepAliveInterval 値の 2 倍です。 |
SupportedProtocols |
インストールされているすべてのプロトコル | このハブでサポートされているプロトコル。 既定では、サーバーに登録されているすべてのプロトコルが許可されます。 この一覧からプロトコルを削除して、個々のハブの特定のプロトコルを無効にすることができます。 |
EnableDetailedErrors |
false |
true にすると、Hub メソッドで例外がスローされたときに、詳細な例外メッセージがクライアントに返されます。 これらの例外メッセージには機密情報が含まれる可能性があるため、既定値は false です。 |
StreamBufferCapacity |
10 |
クライアント アップロード ストリーム用にバッファリングできる項目の最大数。 この制限に達すると、サーバーがストリーム項目を処理するまで、呼び出しの処理はブロックされます。 |
MaximumReceiveMessageSize |
32 KB | 1 つの受信ハブ メッセージの最大サイズ。 値を大きくすると、 サービス拒否 (DoS) 攻撃のリスクが高くなる可能性があります。 |
MaximumParallelInvocationsPerClient |
1 | キューに入れる前に各クライアントが並列で呼び出すことができるハブ メソッドの最大数。 この制限は、ストリーミング ハブの呼び出しには適用されません。 |
DisableImplicitFromServicesParameters |
false |
ハブ メソッドの引数は、可能であれば DI から解決されます。 |
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 |
64KB | バックプレッシャーを適用する前に、サーバーがバッファリングするクライアントから受信する最大のバイト数。 この値を大きくすると、サーバーはバックプレッシャを適用せずに、より大きなメッセージをより高速に受信できますが、メモリ消費量が増加する可能性があります。 |
TransportMaxBufferSize |
64KB | バックプレッシャを監視する前にサーバーがバッファーに格納するアプリによって送信された最大バイト数。 この値を大きくすると、サーバーはバックプレッシャを待たずに、より大きなメッセージをより高速にバッファリングできますが、メモリ消費量が増加する可能性があります。 |
AuthorizationData |
Hub クラスに適用された Authorize 属性から自動的に収集されるデータ。 |
クライアントがハブへの接続を許可されているかどうかを判断するために使用される IAuthorizeData オブジェクトの一覧。 |
Transports |
すべてのトランスポートが有効になっています。 | クライアントが接続に使用できるトランスポートを制限することができる HttpTransportType 値のビットフラグ列挙型です。 |
LongPolling |
以下を参照してください。 | ロングポーリング トランスポートに固有の追加オプション。 |
WebSockets |
以下を参照してください。 | WebSocket トランスポートに固有の追加オプション。 |
MinimumProtocolVersion |
0 | ネゴシエート プロトコルの最小バージョンを指定します。 これは、クライアントを新しいバージョンに制限するために使用されます。 |
TransportSendTimeout |
10 秒 | クライアントへの 1 回の送信が完了するまでトランスポートが待機する最大時間。 送信がこのタイムアウトを超えると、接続は閉じられます。 |
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 "Bearer 認証" トークンとして渡されます (Bearerの種類で Authorization ヘッダーを使用)。 JavaScript クライアントでは、アクセス トークンは Bearer トークンとして使用されます。 ただし、ブラウザー API によってヘッダーを適用する機能が制限されるケースがいくつかあります (具体的には、Server-Sent イベントと WebSocket 要求)。 このような場合、アクセス トークンはクエリ文字列値 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 要求で Bearer 認証トークンとして提供される文字列を返す関数。 |
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 インスタンスを返します。
ハンドラーを置き換えるときは、指定されたハンドラーから保持する設定をコピーしてください。それ以外の場合は、構成されたオプション ( Cookies やヘッダーなど) は新しいハンドラーには適用されません。 |
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