이 문서에서는 ASP.NET Core SignalR 구성에 대해 설명합니다.
Blazor SignalR 이 문서의 지침을 추가하거나 대체하는 지침은 ASP.NET Core BlazorSignalR 지침을 참조하세요.
JSON/MessagePack 직렬화 옵션들
ASP.NET Core SignalR 는 메시지를 인코딩하기 위한 두 가지 프로토콜인 JSON 및 MessagePack을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
AddJsonProtocol 확장 메서드를 사용하여 JSON serialization을 서버에서 구성할 수 있습니다.
AddJsonProtocol
에서 AddSignalR 뒤에 Startup.ConfigureServices
를 추가할 수 있습니다. 메서드는 AddJsonProtocol
개체를 받는 대리자를 options
사용합니다.
PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어, 속성 이름의 대소문자를 기본 카멜 표기법 대신 변경하지 않도록 직렬 변환기를 구성하려면 Program.cs
에 다음 코드를 사용합니다.
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET 클라이언트에서 동일한 AddJsonProtocol
확장 메서드가 있습니다 HubConnectionBuilder.
Microsoft.Extensions.DependencyInjection
확장 메서드를 확인하려면 네임스페이스를 가져와야 합니다.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
비고
지금은 JavaScript 클라이언트에서 JSON serialization을 구성할 수 없습니다.
Newtonsoft.Json으로 전환
Newtonsoft.Json
에서 지원되지 않는 System.Text.Json
의 기능이 필요한 경우, Newtonsoft.Json
로 전환Newtonsoft.Json
을 참조하세요.
MessagePack 직렬화 옵션
MessagePack serialization은 AddMessagePackProtocol 호출에 델리게이트를 제공하여 구성할 수 있습니다. 자세한 내용은 MessagePack in을 SignalR 참조하세요.
비고
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 허브를 구성하는 SignalR 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격에 메시지(keep-alive 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되려면 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 값의 KeepAliveInterval 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다.
KeepAliveInterval 를 변경할 때, 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경하세요. 권장 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대한 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
이 경우 true 허브 메서드에서 예외가 throw될 때 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문입니다 false . |
StreamBufferCapacity |
10 |
클라이언트 업로드 스트림에 대해 버퍼링할 수 있는 최대 항목 수입니다. 이 제한에 도달하면 서버가 스트림 항목을 처리할 때까지 호출 처리가 차단됩니다. |
MaximumReceiveMessageSize |
32KB | 단일 들어오는 허브 메시지의 최대 크기입니다. 값을 늘리면 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 |
허브 클래스에 Authorize 적용된 특성에서 자동으로 수집되는 데이터입니다. |
클라이언트가 IAuthorizeData 허브에 연결할 권한이 있는지 확인하는 데 사용되는 개체 목록입니다. |
Transports |
모든 전송이 활성화되었습니다. | 클라이언트가 연결에 사용할 수 있는 전송 수단을 제한할 수 있는 HttpTransportType 값의 비트 플래그 열거형입니다. |
LongPolling |
아래를 참조하세요. | 긴 폴링 전송 방식과 관련된 추가 옵션입니다. |
WebSockets |
아래를 참조하세요. | WebSockets 전송과 관련된 추가 옵션입니다. |
MinimumProtocolVersion |
0 | 협상 프로토콜의 최소 버전을 지정합니다. 클라이언트를 최신 버전으로 제한하는 데 사용됩니다. |
CloseOnAuthenticationExpiration |
거짓 | 토큰이 만료될 때 연결을 닫는 인증 만료 추적을 사용하도록 설정하려면 이 옵션을 설정합니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 단일 폴링 요청을 종료하기 전에 서버가 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 설문 조사 요청을 더 자주 실행하게 됩니다. |
WebSocket 전송에는 속성을 사용하여 WebSockets
구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫히면 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
헤더를 사용자 정의 값으로 설정하는 Sec-WebSocket-Protocol 에 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 형식( HubConnectionBuilder
.NET 및 JavaScript 클라이언트에서 사용 가능)에서 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만, 작성기 구성 옵션은 HttpHubConnectionBuilder
서브클래스에 포함되어 있으며, HubConnection
자체에도 포함되어 있습니다.
로깅 구성
로깅은 .NET 클라이언트에서 ConfigureLogging
메서드를 사용하여 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 것과 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core의 로깅 설명서를 참조하세요.
비고
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 문서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 NuGet 패키지를 설치 Microsoft.Extensions.Logging.Console
합니다. 확장 메서드를 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 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 나열합니다. 기록될 configureLogging
로그 수준을 설정하기 위해 제공하는 값입니다. 이 수준에서 기록된 메시지 또는 테이블에 나열된 수준이 기록됩니다.
문자열 | 로그레벨 |
---|---|
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 클라이언트는 SignalR 로깅에 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 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 transport
필드를 withUrl
에 제공된 옵션 객체에서 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 withTransport
의 HttpHubConnectionBuilder
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
비고
Java 클라이언트는 SignalR 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
요청과 함께 SignalR 인증 데이터를 제공하려면 JavaScript에서 옵션을AccessTokenProvider
사용하여 accessTokenFactory
원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP "Bearer 인증" 토큰으로 전달됩니다(Authorization
헤더를 Bearer
형식으로 사용하여). JavaScript 클라이언트에서 액세스 토큰은 브라우저 API가 헤더를 적용하는 기능(특히 Server-Sent 이벤트 및 WebSockets 요청)을 제한하는 몇 가지 경우를 제외하고 전달자 토큰으로 사용됩니다. 이러한 경우 액세스 토큰은 쿼리 문자열 값 access_token
으로 제공됩니다.
.NET 클라이언트에서 옵션은 다음의 AccessTokenProvider
옵션 대리자를 사용하여 지정할 수 있습니다.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를 사용하여 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 (onclose JavaScript). 이 값 은 서버에서 ping 메시지를 보내고 시간 제한 간격 내에 클라이언트가 수신할 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하는 서버의 연결 유지 간격(WithKeepAliveInterval ) 값의 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한이며 HubConnection 개체 자체에서 사용할 수 있습니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 이벤트를 트리거합니다 Closed (onclose JavaScript). 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
WithKeepAliveInterval |
15초 | 클라이언트가 ping 메시지를 보내는 간격을 결정하며, 이는 HubConnectionBuilder에 직접 설정됩니다. 이 설정을 사용하면 클라이언트가 네트워크에서 컴퓨터를 분리하는 경우 등 서버에서 하드 연결 끊기를 감지할 수 있습니다. 클라이언트에서 메시지를 보내면 타이머가 간격의 시작으로 다시 설정됩니다. 클라이언트가 서버의 집합에 ClientTimeoutInterval 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊긴 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 값으로 TimeSpan
지정됩니다.
다음 예제에서는 기본값의 두 배인 값을 보여줍니다.
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바이트인 선택 사항입니다.
추가 옵션 구성
Java 클라이언트에서는 WithUrl
메서드의 withUrl
(HubConnectionBuilder
는 JavaScript) 또는 다양한 구성 HttpHubConnectionBuilder
API에서 추가 옵션을 구성할 수 있습니다.
.NET 옵션 | 기본값 | 설명 |
---|---|---|
AccessTokenProvider |
null |
HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다. |
SkipNegotiation |
false |
협상 단계를 건너뛰도록 true 설정합니다.
WebSockets 전송이 유일하게 사용하도록 설정된 전송인 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용할 수 없습니다. |
ClientCertificates |
비어 있는 | 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다. |
Cookies |
비어 있는 | 모든 HTTP 요청과 함께 보낼 HTTP 쿠키의 컬렉션입니다. |
Credentials |
비어 있는 | 모든 HTTP 요청과 함께 보낼 자격 증명입니다. |
CloseTimeout |
5초 | WebSockets만 해당합니다. 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다. |
Headers |
비어 있는 | 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다. |
HttpMessageHandlerFactory |
null |
HTTP 요청을 보내는 데 사용되는 HttpMessageHandler 를 구성하거나 대체할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다.
처리기를 바꿀 때 제공된 처리기에서 유지하려는 설정을 복사해야 합니다. 그렇지 않으면 구성된 옵션(예: 쿠키 및 헤더)이 새 처리기에 적용되지 않습니다. |
Proxy |
null |
HTTP 요청을 보낼 때 사용할 HTTP 프록시입니다. |
UseDefaultCredentials |
false |
HTTP 및 WebSockets 요청에 대한 기본 자격 증명을 보내려면 이 불리언 값을 설정합니다. 이렇게 하면 Windows 인증을 사용할 수 있습니다. |
WebSocketConfiguration |
null |
추가 WebSocket 옵션을 구성하는 데 사용할 수 있는 대리자입니다. 옵션을 구성하는 데 사용할 수 있는 인스턴스 ClientWebSocketOptions 를 받습니다. |
ApplicationMaxBufferSize |
1MB | 백프레어를 적용하기 전에 클라이언트가 버퍼링하는 서버에서 받은 최대 바이트 수입니다. 이 값을 늘리면 클라이언트가 백프레서를 적용하지 않고 더 큰 메시지를 더 빠르게 받을 수 있지만 메모리 사용량이 증가할 수 있습니다. |
TransportMaxBufferSize |
1MB | 사용자 애플리케이션이 보낸 데이터를 클라이언트가 버퍼링할 때 역압을 관찰하기 전에 버퍼링되는 최대 바이트 수입니다. 이 값을 늘리면 클라이언트가 백프레어를 기다리지 않고 더 큰 메시지를 더 빠르게 버퍼링할 수 있지만 메모리 사용량이 증가할 수 있습니다. |
이 옵션은 .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 는 메시지를 인코딩하기 위한 두 가지 프로토콜인 JSON 및 MessagePack을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
서버에서 JSON serialization은 AddJsonProtocol 확장 메서드를 사용하여 구성할 수 있으며, 이 메서드는 AddSignalR 메서드에 Startup.ConfigureServices
뒤에 추가될 수 있습니다. 메서드는 AddJsonProtocol
개체를 받는 대리자를 options
사용합니다.
PayloadSerializerSettings 해당 개체의 속성은 인수 및 반환 값의 serialization을 구성하는 데 사용할 수 있는 Json.NET JsonSerializerSettings
개체입니다. 자세한 내용은 Json.NET 설명서를 참조하세요.
예를 들어 기본적으로 "카멜 표기법" 이름 대신 "PascalCase" 속성 이름을 사용하도록 serializer를 구성하려면 다음 코드 블록에 을 사용하십시오.
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 serialization을 구성할 수 없습니다.
MessagePack 직렬화 옵션
MessagePack serialization은 AddMessagePackProtocol 호출에 델리게이트를 제공하여 구성할 수 있습니다. 자세한 내용은 MessagePack in을 SignalR 참조하세요.
비고
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 허브를 구성하는 SignalR 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다.
KeepAliveInterval 를 변경할 때, 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경하세요. 권장 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대한 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
이 경우 true 허브 메서드에서 예외가 throw될 때 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문입니다 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 |
32KB | 서버가 버퍼링하는 클라이언트에서 받은 최대 바이트 수입니다. 이 값을 늘리면 서버가 더 큰 메시지를 받을 수 있지만 메모리 소비에 부정적인 영향을 미칠 수 있습니다. |
AuthorizationData |
허브 클래스에 Authorize 적용된 특성에서 자동으로 수집되는 데이터입니다. |
클라이언트가 IAuthorizeData 허브에 연결할 권한이 있는지 확인하는 데 사용되는 개체 목록입니다. |
TransportMaxBufferSize |
32KB | 서버가 버퍼링하는 앱에서 보낸 최대 바이트 수입니다. 이 값을 늘리면 서버에서 더 큰 메시지를 보낼 수 있지만 메모리 소비에 부정적인 영향을 미칠 수 있습니다. |
Transports |
모든 전송이 활성화되었습니다. | 클라이언트가 연결에 사용할 수 있는 전송 수단을 제한할 수 있는 HttpTransportType 값의 비트 플래그 열거형입니다. |
LongPolling |
아래를 참조하세요. | 긴 폴링 전송 방식과 관련된 추가 옵션입니다. |
WebSockets |
아래를 참조하세요. | WebSockets 전송과 관련된 추가 옵션입니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 단일 폴링 요청을 종료하기 전에 서버가 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 설문 조사 요청을 더 자주 실행하게 됩니다. |
WebSocket 전송에는 속성을 사용하여 WebSockets
구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫히면 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
헤더를 사용자 정의 값으로 설정하는 Sec-WebSocket-Protocol 에 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 형식( HubConnectionBuilder
.NET 및 JavaScript 클라이언트에서 사용 가능)에서 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만, 작성기 구성 옵션은 HttpHubConnectionBuilder
서브클래스에 포함되어 있으며, HubConnection
자체에도 포함되어 있습니다.
로깅 구성
로깅은 .NET 클라이언트에서 ConfigureLogging
메서드를 사용하여 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 것과 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core의 로깅 설명서를 참조하세요.
비고
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 문서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 NuGet 패키지를 설치 Microsoft.Extensions.Logging.Console
합니다. 확장 메서드를 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하세요.
Java 클라이언트는 SignalR 로깅에 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 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 transport
필드를 withUrl
에 제공된 옵션 객체에서 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
전달자 인증 구성
요청과 함께 SignalR 인증 데이터를 제공하려면 JavaScript에서 옵션을AccessTokenProvider
사용하여 accessTokenFactory
원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP "Bearer 인증" 토큰으로 전달됩니다(Authorization
헤더를 Bearer
형식으로 사용하여). JavaScript 클라이언트에서 액세스 토큰은 브라우저 API가 헤더를 적용하는 기능(특히 Server-Sent 이벤트 및 WebSockets 요청)을 제한하는 몇 가지 경우를 제외하고 전달자 토큰으로 사용됩니다. 이러한 경우 액세스 토큰은 쿼리 문자열 값 access_token
으로 제공됩니다.
.NET 클라이언트에서 옵션은 다음의 AccessTokenProvider
옵션 대리자를 사용하여 지정할 수 있습니다.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를 사용하여 RxJava단일<문자열>을 제공합니다. 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 (onclose JavaScript). 이 값 은 서버에서 ping 메시지를 보내고 시간 제한 간격 내에 클라이언트가 수신할 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하기 위해 서버 값의 KeepAliveInterval 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크의 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 이벤트를 트리거합니다 Closed (onclose JavaScript). 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
.NET 클라이언트에서 시간 제한 값은 값으로 TimeSpan
지정됩니다.
추가 옵션 구성
Java 클라이언트에서는 WithUrl
메서드의 withUrl
(HubConnectionBuilder
는 JavaScript) 또는 다양한 구성 HttpHubConnectionBuilder
API에서 추가 옵션을 구성할 수 있습니다.
.NET 옵션 | 기본값 | 설명 |
---|---|---|
AccessTokenProvider |
null |
HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다. |
SkipNegotiation |
false |
협상 단계를 건너뛰도록 true 설정합니다.
WebSockets 전송이 유일하게 사용하도록 설정된 전송인 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용할 수 없습니다. |
ClientCertificates |
비어 있는 | 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다. |
Cookies |
비어 있는 | 모든 HTTP 요청과 함께 보낼 HTTP 쿠키의 컬렉션입니다. |
Credentials |
비어 있는 | 모든 HTTP 요청과 함께 보낼 자격 증명입니다. |
CloseTimeout |
5초 | WebSockets만 해당합니다. 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다. |
Headers |
비어 있는 | 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다. |
HttpMessageHandlerFactory |
null |
HTTP 요청을 보내는 데 사용되는 HttpMessageHandler 를 구성하거나 대체할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다.
처리기를 바꿀 때 제공된 처리기에서 유지하려는 설정을 복사해야 합니다. 그렇지 않으면 구성된 옵션(예: 쿠키 및 헤더)이 새 처리기에 적용되지 않습니다. |
Proxy |
null |
HTTP 요청을 보낼 때 사용할 HTTP 프록시입니다. |
UseDefaultCredentials |
false |
HTTP 및 WebSockets 요청에 대한 기본 자격 증명을 보내려면 이 불리언 값을 설정합니다. 이렇게 하면 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 는 메시지를 인코딩하기 위한 두 가지 프로토콜인 JSON 및 MessagePack을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
서버에서 JSON serialization은 AddJsonProtocol 확장 메서드를 사용하여 구성할 수 있으며, 이 메서드는 AddSignalR 메서드에 Startup.ConfigureServices
뒤에 추가될 수 있습니다. 메서드는 AddJsonProtocol
개체를 받는 대리자를 options
사용합니다.
PayloadSerializerSettings 해당 개체의 속성은 인수 및 반환 값의 serialization을 구성하는 데 사용할 수 있는 Json.NET JsonSerializerSettings
개체입니다. 자세한 내용은 Json.NET 설명서를 참조하세요.
예를 들어 기본적으로 "카멜 표기법" 이름 대신 "PascalCase" 속성 이름을 사용하도록 serializer를 구성하려면 다음 코드 블록에 을 사용하십시오.
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 serialization을 구성할 수 없습니다.
MessagePack 직렬화 옵션
MessagePack serialization은 AddMessagePackProtocol 호출에 델리게이트를 제공하여 구성할 수 있습니다. 자세한 내용은 MessagePack in을 SignalR 참조하세요.
비고
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 허브를 구성하는 SignalR 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격에 메시지(keep-alive 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되려면 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 값의 KeepAliveInterval 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다.
KeepAliveInterval 를 변경할 때, 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경하세요. 권장 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대한 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
이 경우 true 허브 메서드에서 예외가 throw될 때 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문입니다 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 |
32KB | 서버가 버퍼링하는 클라이언트에서 받은 최대 바이트 수입니다. 이 값을 늘리면 서버가 더 큰 메시지를 받을 수 있지만 메모리 소비에 부정적인 영향을 미칠 수 있습니다. |
AuthorizationData |
허브 클래스에 Authorize 적용된 특성에서 자동으로 수집되는 데이터입니다. |
클라이언트가 IAuthorizeData 허브에 연결할 권한이 있는지 확인하는 데 사용되는 개체 목록입니다. |
TransportMaxBufferSize |
32KB | 서버가 버퍼링하는 앱에서 보낸 최대 바이트 수입니다. 이 값을 늘리면 서버에서 더 큰 메시지를 보낼 수 있지만 메모리 소비에 부정적인 영향을 미칠 수 있습니다. |
Transports |
모든 전송이 활성화되었습니다. | 클라이언트가 연결에 사용할 수 있는 전송 수단을 제한할 수 있는 HttpTransportType 값의 비트 플래그 열거형입니다. |
LongPolling |
아래를 참조하세요. | 긴 폴링 전송 방식과 관련된 추가 옵션입니다. |
WebSockets |
아래를 참조하세요. | WebSockets 전송과 관련된 추가 옵션입니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 단일 폴링 요청을 종료하기 전에 서버가 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 설문 조사 요청을 더 자주 실행하게 됩니다. |
WebSocket 전송에는 속성을 사용하여 WebSockets
구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫히면 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
헤더를 사용자 정의 값으로 설정하는 Sec-WebSocket-Protocol 에 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 형식( HubConnectionBuilder
.NET 및 JavaScript 클라이언트에서 사용 가능)에서 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만, 작성기 구성 옵션은 HttpHubConnectionBuilder
서브클래스에 포함되어 있으며, HubConnection
자체에도 포함되어 있습니다.
로깅 구성
로깅은 .NET 클라이언트에서 ConfigureLogging
메서드를 사용하여 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 것과 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core의 로깅 설명서를 참조하세요.
비고
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 문서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 NuGet 패키지를 설치 Microsoft.Extensions.Logging.Console
합니다. 확장 메서드를 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하세요.
Java 클라이언트는 SignalR 로깅에 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 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 transport
필드를 withUrl
에 제공된 옵션 객체에서 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
전달자 인증 구성
요청과 함께 SignalR 인증 데이터를 제공하려면 JavaScript에서 옵션을AccessTokenProvider
사용하여 accessTokenFactory
원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP "Bearer 인증" 토큰으로 전달됩니다(Authorization
헤더를 Bearer
형식으로 사용하여). JavaScript 클라이언트에서 액세스 토큰은 브라우저 API가 헤더를 적용하는 기능(특히 Server-Sent 이벤트 및 WebSockets 요청)을 제한하는 몇 가지 경우를 제외하고 전달자 토큰으로 사용됩니다. 이러한 경우 액세스 토큰은 쿼리 문자열 값 access_token
으로 제공됩니다.
.NET 클라이언트에서 옵션은 다음의 AccessTokenProvider
옵션 대리자를 사용하여 지정할 수 있습니다.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를 사용하여 RxJava단일<문자열>을 제공합니다. 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 (onclose JavaScript). 이 값 은 서버에서 ping 메시지를 보내고 시간 제한 간격 내에 클라이언트가 수신할 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하기 위해 서버 값의 KeepAliveInterval 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크의 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 이벤트를 트리거합니다 Closed (onclose JavaScript). 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트가 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머가 간격의 시작으로 다시 설정됩니다. 클라이언트가 서버의 집합에 ClientTimeoutInterval 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊긴 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 값으로 TimeSpan
지정됩니다.
추가 옵션 구성
Java 클라이언트에서는 WithUrl
메서드의 withUrl
(HubConnectionBuilder
는 JavaScript) 또는 다양한 구성 HttpHubConnectionBuilder
API에서 추가 옵션을 구성할 수 있습니다.
.NET 옵션 | 기본값 | 설명 |
---|---|---|
AccessTokenProvider |
null |
HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다. |
SkipNegotiation |
false |
협상 단계를 건너뛰도록 true 설정합니다.
WebSockets 전송이 유일하게 사용하도록 설정된 전송인 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용할 수 없습니다. |
ClientCertificates |
비어 있는 | 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다. |
Cookies |
비어 있는 | 모든 HTTP 요청과 함께 보낼 HTTP 쿠키의 컬렉션입니다. |
Credentials |
비어 있는 | 모든 HTTP 요청과 함께 보낼 자격 증명입니다. |
CloseTimeout |
5초 | WebSockets만 해당합니다. 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다. |
Headers |
비어 있는 | 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다. |
HttpMessageHandlerFactory |
null |
HTTP 요청을 보내는 데 사용되는 HttpMessageHandler 를 구성하거나 대체할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다.
처리기를 바꿀 때 제공된 처리기에서 유지하려는 설정을 복사해야 합니다. 그렇지 않으면 구성된 옵션(예: 쿠키 및 헤더)이 새 처리기에 적용되지 않습니다. |
Proxy |
null |
HTTP 요청을 보낼 때 사용할 HTTP 프록시입니다. |
UseDefaultCredentials |
false |
HTTP 및 WebSockets 요청에 대한 기본 자격 증명을 보내려면 이 불리언 값을 설정합니다. 이렇게 하면 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 는 메시지를 인코딩하기 위한 두 가지 프로토콜인 JSON 및 MessagePack을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
AddJsonProtocol 확장 메서드를 사용하여 JSON serialization을 서버에서 구성할 수 있습니다.
AddJsonProtocol
에서 AddSignalR 뒤에 Startup.ConfigureServices
를 추가할 수 있습니다. 메서드는 AddJsonProtocol
개체를 받는 대리자를 options
사용합니다.
PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어, 속성 이름의 대소문자를 기본 카멜 표기법 대신 변경하지 않도록 직렬 변환기를 구성하려면 Startup.ConfigureServices
에 다음 코드를 사용합니다.
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET 클라이언트에서 동일한 AddJsonProtocol
확장 메서드가 있습니다 HubConnectionBuilder.
Microsoft.Extensions.DependencyInjection
확장 메서드를 확인하려면 네임스페이스를 가져와야 합니다.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
비고
지금은 JavaScript 클라이언트에서 JSON serialization을 구성할 수 없습니다.
Newtonsoft.Json으로 전환
Newtonsoft.Json
에서 지원되지 않는 System.Text.Json
의 기능이 필요한 경우, Newtonsoft.Json
로 전환Newtonsoft.Json
을 참조하세요.
MessagePack 직렬화 옵션
MessagePack serialization은 AddMessagePackProtocol 호출에 델리게이트를 제공하여 구성할 수 있습니다. 자세한 내용은 MessagePack in을 SignalR 참조하세요.
비고
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 허브를 구성하는 SignalR 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격에 메시지(keep-alive 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되려면 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 값의 KeepAliveInterval 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다.
KeepAliveInterval 를 변경할 때, 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경하세요. 권장 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대한 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
이 경우 true 허브 메서드에서 예외가 throw될 때 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문입니다 false . |
StreamBufferCapacity |
10 |
클라이언트 업로드 스트림에 대해 버퍼링할 수 있는 최대 항목 수입니다. 이 제한에 도달하면 서버가 스트림 항목을 처리할 때까지 호출 처리가 차단됩니다. |
MaximumReceiveMessageSize |
32KB | 단일 들어오는 허브 메시지의 최대 크기입니다. 값을 늘리면 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 |
32KB | 백프레어를 적용하기 전에 서버가 버퍼링하는 클라이언트에서 받은 최대 바이트 수입니다. 이 값을 늘리면 서버가 백프레서를 적용하지 않고도 더 큰 메시지를 더 빠르게 받을 수 있지만 메모리 사용량이 증가할 수 있습니다. |
AuthorizationData |
허브 클래스에 Authorize 적용된 특성에서 자동으로 수집되는 데이터입니다. |
클라이언트가 IAuthorizeData 허브에 연결할 권한이 있는지 확인하는 데 사용되는 개체 목록입니다. |
TransportMaxBufferSize |
32KB | 서버가 역압을 감지하기 전에 버퍼링하는 앱에서 전송한 최대 바이트 수입니다. 이 값을 늘리면 서버가 백프레어를 기다리지 않고 더 큰 메시지를 더 빠르게 버퍼링할 수 있지만 메모리 사용량이 증가할 수 있습니다. |
Transports |
모든 전송이 활성화되었습니다. | 클라이언트가 연결에 사용할 수 있는 전송 수단을 제한할 수 있는 HttpTransportType 값의 비트 플래그 열거형입니다. |
LongPolling |
아래를 참조하세요. | 긴 폴링 전송 방식과 관련된 추가 옵션입니다. |
WebSockets |
아래를 참조하세요. | WebSockets 전송과 관련된 추가 옵션입니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 단일 폴링 요청을 종료하기 전에 서버가 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 설문 조사 요청을 더 자주 실행하게 됩니다. |
WebSocket 전송에는 속성을 사용하여 WebSockets
구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫히면 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
헤더를 사용자 정의 값으로 설정하는 Sec-WebSocket-Protocol 에 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 형식( HubConnectionBuilder
.NET 및 JavaScript 클라이언트에서 사용 가능)에서 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만, 작성기 구성 옵션은 HttpHubConnectionBuilder
서브클래스에 포함되어 있으며, HubConnection
자체에도 포함되어 있습니다.
로깅 구성
로깅은 .NET 클라이언트에서 ConfigureLogging
메서드를 사용하여 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 것과 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core의 로깅 설명서를 참조하세요.
비고
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 문서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 NuGet 패키지를 설치 Microsoft.Extensions.Logging.Console
합니다. 확장 메서드를 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 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 나열합니다. 기록될 configureLogging
로그 수준을 설정하기 위해 제공하는 값입니다. 이 수준에서 기록된 메시지 또는 테이블에 나열된 수준이 기록됩니다.
문자열 | 로그레벨 |
---|---|
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 클라이언트는 SignalR 로깅에 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 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 transport
필드를 withUrl
에 제공된 옵션 객체에서 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 withTransport
의 HttpHubConnectionBuilder
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
비고
Java 클라이언트는 SignalR 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
요청과 함께 SignalR 인증 데이터를 제공하려면 JavaScript에서 옵션을AccessTokenProvider
사용하여 accessTokenFactory
원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP "Bearer 인증" 토큰으로 전달됩니다(Authorization
헤더를 Bearer
형식으로 사용하여). JavaScript 클라이언트에서 액세스 토큰은 브라우저 API가 헤더를 적용하는 기능(특히 Server-Sent 이벤트 및 WebSockets 요청)을 제한하는 몇 가지 경우를 제외하고 전달자 토큰으로 사용됩니다. 이러한 경우 액세스 토큰은 쿼리 문자열 값 access_token
으로 제공됩니다.
.NET 클라이언트에서 옵션은 다음의 AccessTokenProvider
옵션 대리자를 사용하여 지정할 수 있습니다.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를 사용하여 RxJava단일<문자열>을 제공합니다. 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 (onclose JavaScript). 이 값 은 서버에서 ping 메시지를 보내고 시간 제한 간격 내에 클라이언트가 수신할 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하기 위해 서버 값의 KeepAliveInterval 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크의 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 이벤트를 트리거합니다 Closed (onclose JavaScript). 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트가 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머가 간격의 시작으로 다시 설정됩니다. 클라이언트가 서버의 집합에 ClientTimeoutInterval 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊긴 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 값으로 TimeSpan
지정됩니다.
추가 옵션 구성
Java 클라이언트에서는 WithUrl
메서드의 withUrl
(HubConnectionBuilder
는 JavaScript) 또는 다양한 구성 HttpHubConnectionBuilder
API에서 추가 옵션을 구성할 수 있습니다.
.NET 옵션 | 기본값 | 설명 |
---|---|---|
AccessTokenProvider |
null |
HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다. |
SkipNegotiation |
false |
협상 단계를 건너뛰도록 true 설정합니다.
WebSockets 전송이 유일하게 사용하도록 설정된 전송인 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용할 수 없습니다. |
ClientCertificates |
비어 있는 | 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다. |
Cookies |
비어 있는 | 모든 HTTP 요청과 함께 보낼 HTTP 쿠키의 컬렉션입니다. |
Credentials |
비어 있는 | 모든 HTTP 요청과 함께 보낼 자격 증명입니다. |
CloseTimeout |
5초 | WebSockets만 해당합니다. 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다. |
Headers |
비어 있는 | 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다. |
HttpMessageHandlerFactory |
null |
HTTP 요청을 보내는 데 사용되는 HttpMessageHandler 를 구성하거나 대체할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다.
처리기를 바꿀 때 제공된 처리기에서 유지하려는 설정을 복사해야 합니다. 그렇지 않으면 구성된 옵션(예: 쿠키 및 헤더)이 새 처리기에 적용되지 않습니다. |
Proxy |
null |
HTTP 요청을 보낼 때 사용할 HTTP 프록시입니다. |
UseDefaultCredentials |
false |
HTTP 및 WebSockets 요청에 대한 기본 자격 증명을 보내려면 이 불리언 값을 설정합니다. 이렇게 하면 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 는 메시지를 인코딩하기 위한 두 가지 프로토콜인 JSON 및 MessagePack을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
AddJsonProtocol 확장 메서드를 사용하여 JSON serialization을 서버에서 구성할 수 있습니다.
AddJsonProtocol
에서 AddSignalR 뒤에 Startup.ConfigureServices
를 추가할 수 있습니다. 메서드는 AddJsonProtocol
개체를 받는 대리자를 options
사용합니다.
PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어, 속성 이름의 대소문자를 기본 카멜 표기법 대신 변경하지 않도록 직렬 변환기를 구성하려면 Startup.ConfigureServices
에 다음 코드를 사용합니다.
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null
});
.NET 클라이언트에서 동일한 AddJsonProtocol
확장 메서드가 있습니다 HubConnectionBuilder.
Microsoft.Extensions.DependencyInjection
확장 메서드를 확인하려면 네임스페이스를 가져와야 합니다.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
비고
지금은 JavaScript 클라이언트에서 JSON serialization을 구성할 수 없습니다.
Newtonsoft.Json으로 전환
Newtonsoft.Json
에서 지원되지 않는 System.Text.Json
의 기능이 필요한 경우, Newtonsoft.Json
로 전환Newtonsoft.Json
을 참조하세요.
MessagePack 직렬화 옵션
MessagePack serialization은 AddMessagePackProtocol 호출에 델리게이트를 제공하여 구성할 수 있습니다. 자세한 내용은 MessagePack in을 SignalR 참조하세요.
비고
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 허브를 구성하는 SignalR 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격에 메시지(keep-alive 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되려면 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 값의 KeepAliveInterval 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다.
KeepAliveInterval 를 변경할 때, 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경하세요. 권장 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대한 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
이 경우 true 허브 메서드에서 예외가 throw될 때 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문입니다 false . |
StreamBufferCapacity |
10 |
클라이언트 업로드 스트림에 대해 버퍼링할 수 있는 최대 항목 수입니다. 이 제한에 도달하면 서버가 스트림 항목을 처리할 때까지 호출 처리가 차단됩니다. |
MaximumReceiveMessageSize |
32KB | 단일 들어오는 허브 메시지의 최대 크기입니다. 값을 늘리면 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 |
32KB | 백프레어를 적용하기 전에 서버가 버퍼링하는 클라이언트에서 받은 최대 바이트 수입니다. 이 값을 늘리면 서버가 백프레서를 적용하지 않고도 더 큰 메시지를 더 빠르게 받을 수 있지만 메모리 사용량이 증가할 수 있습니다. |
AuthorizationData |
허브 클래스에 Authorize 적용된 특성에서 자동으로 수집되는 데이터입니다. |
클라이언트가 IAuthorizeData 허브에 연결할 권한이 있는지 확인하는 데 사용되는 개체 목록입니다. |
TransportMaxBufferSize |
32KB | 서버가 역압을 감지하기 전에 버퍼링하는 앱에서 전송한 최대 바이트 수입니다. 이 값을 늘리면 서버가 백프레어를 기다리지 않고 더 큰 메시지를 더 빠르게 버퍼링할 수 있지만 메모리 사용량이 증가할 수 있습니다. |
Transports |
모든 전송이 활성화되었습니다. | 클라이언트가 연결에 사용할 수 있는 전송 수단을 제한할 수 있는 HttpTransportType 값의 비트 플래그 열거형입니다. |
LongPolling |
아래를 참조하세요. | 긴 폴링 전송 방식과 관련된 추가 옵션입니다. |
WebSockets |
아래를 참조하세요. | WebSockets 전송과 관련된 추가 옵션입니다. |
MinimumProtocolVersion |
0 | 협상 프로토콜의 최소 버전을 지정합니다. 클라이언트를 최신 버전으로 제한하는 데 사용됩니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 단일 폴링 요청을 종료하기 전에 서버가 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 설문 조사 요청을 더 자주 실행하게 됩니다. |
WebSocket 전송에는 속성을 사용하여 WebSockets
구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫히면 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
헤더를 사용자 정의 값으로 설정하는 Sec-WebSocket-Protocol 에 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 형식( HubConnectionBuilder
.NET 및 JavaScript 클라이언트에서 사용 가능)에서 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만, 작성기 구성 옵션은 HttpHubConnectionBuilder
서브클래스에 포함되어 있으며, HubConnection
자체에도 포함되어 있습니다.
로깅 구성
로깅은 .NET 클라이언트에서 ConfigureLogging
메서드를 사용하여 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 것과 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core의 로깅 설명서를 참조하세요.
비고
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 문서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 NuGet 패키지를 설치 Microsoft.Extensions.Logging.Console
합니다. 확장 메서드를 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 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 나열합니다. 기록될 configureLogging
로그 수준을 설정하기 위해 제공하는 값입니다. 이 수준에서 기록된 메시지 또는 테이블에 나열된 수준이 기록됩니다.
문자열 | 로그레벨 |
---|---|
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 클라이언트는 SignalR 로깅에 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 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 transport
필드를 withUrl
에 제공된 옵션 객체에서 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 withTransport
의 HttpHubConnectionBuilder
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
비고
Java 클라이언트는 SignalR 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
요청과 함께 SignalR 인증 데이터를 제공하려면 JavaScript에서 옵션을AccessTokenProvider
사용하여 accessTokenFactory
원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP "Bearer 인증" 토큰으로 전달됩니다(Authorization
헤더를 Bearer
형식으로 사용하여). JavaScript 클라이언트에서 액세스 토큰은 브라우저 API가 헤더를 적용하는 기능(특히 Server-Sent 이벤트 및 WebSockets 요청)을 제한하는 몇 가지 경우를 제외하고 전달자 토큰으로 사용됩니다. 이러한 경우 액세스 토큰은 쿼리 문자열 값 access_token
으로 제공됩니다.
.NET 클라이언트에서 옵션은 다음의 AccessTokenProvider
옵션 대리자를 사용하여 지정할 수 있습니다.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를 사용하여 RxJava단일<문자열>을 제공합니다. 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 (onclose JavaScript). 이 값 은 서버에서 ping 메시지를 보내고 시간 제한 간격 내에 클라이언트가 수신할 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하기 위해 서버 값의 KeepAliveInterval 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크의 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 이벤트를 트리거합니다 Closed (onclose JavaScript). 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트가 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머가 간격의 시작으로 다시 설정됩니다. 클라이언트가 서버의 집합에 ClientTimeoutInterval 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊긴 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 값으로 TimeSpan
지정됩니다.
추가 옵션 구성
Java 클라이언트에서는 WithUrl
메서드의 withUrl
(HubConnectionBuilder
는 JavaScript) 또는 다양한 구성 HttpHubConnectionBuilder
API에서 추가 옵션을 구성할 수 있습니다.
.NET 옵션 | 기본값 | 설명 |
---|---|---|
AccessTokenProvider |
null |
HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다. |
SkipNegotiation |
false |
협상 단계를 건너뛰도록 true 설정합니다.
WebSockets 전송이 유일하게 사용하도록 설정된 전송인 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용할 수 없습니다. |
ClientCertificates |
비어 있는 | 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다. |
Cookies |
비어 있는 | 모든 HTTP 요청과 함께 보낼 HTTP 쿠키의 컬렉션입니다. |
Credentials |
비어 있는 | 모든 HTTP 요청과 함께 보낼 자격 증명입니다. |
CloseTimeout |
5초 | WebSockets만 해당합니다. 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다. |
Headers |
비어 있는 | 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다. |
HttpMessageHandlerFactory |
null |
HTTP 요청을 보내는 데 사용되는 HttpMessageHandler 를 구성하거나 대체할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다.
처리기를 바꿀 때 제공된 처리기에서 유지하려는 설정을 복사해야 합니다. 그렇지 않으면 구성된 옵션(예: 쿠키 및 헤더)이 새 처리기에 적용되지 않습니다. |
Proxy |
null |
HTTP 요청을 보낼 때 사용할 HTTP 프록시입니다. |
UseDefaultCredentials |
false |
HTTP 및 WebSockets 요청에 대한 기본 자격 증명을 보내려면 이 불리언 값을 설정합니다. 이렇게 하면 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 는 메시지를 인코딩하기 위한 두 가지 프로토콜인 JSON 및 MessagePack을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
AddJsonProtocol 확장 메서드를 사용하여 JSON serialization을 서버에서 구성할 수 있습니다.
AddJsonProtocol
에서 AddSignalR 뒤에 Startup.ConfigureServices
를 추가할 수 있습니다. 메서드는 AddJsonProtocol
개체를 받는 대리자를 options
사용합니다.
PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어, 속성 이름의 대소문자를 기본 카멜 표기법 대신 변경하지 않도록 직렬 변환기를 구성하려면 Startup.ConfigureServices
에 다음 코드를 사용합니다.
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET 클라이언트에서 동일한 AddJsonProtocol
확장 메서드가 있습니다 HubConnectionBuilder.
Microsoft.Extensions.DependencyInjection
확장 메서드를 확인하려면 네임스페이스를 가져와야 합니다.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
비고
지금은 JavaScript 클라이언트에서 JSON serialization을 구성할 수 없습니다.
Newtonsoft.Json으로 전환
Newtonsoft.Json
에서 지원되지 않는 System.Text.Json
의 기능이 필요한 경우, Newtonsoft.Json
로 전환Newtonsoft.Json
을 참조하세요.
MessagePack 직렬화 옵션
MessagePack serialization은 AddMessagePackProtocol 호출에 델리게이트를 제공하여 구성할 수 있습니다. 자세한 내용은 MessagePack in을 SignalR 참조하세요.
비고
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 허브를 구성하는 SignalR 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격에 메시지(keep-alive 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되려면 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 값의 KeepAliveInterval 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다.
KeepAliveInterval 를 변경할 때, 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경하세요. 권장 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대한 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
이 경우 true 허브 메서드에서 예외가 throw될 때 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문입니다 false . |
StreamBufferCapacity |
10 |
클라이언트 업로드 스트림에 대해 버퍼링할 수 있는 최대 항목 수입니다. 이 제한에 도달하면 서버가 스트림 항목을 처리할 때까지 호출 처리가 차단됩니다. |
MaximumReceiveMessageSize |
32KB | 단일 들어오는 허브 메시지의 최대 크기입니다. 값을 늘리면 DoS(서비스 거부) 공격의 위험이 증가할 수 있습니다. |
MaximumParallelInvocationsPerClient |
1 | 큐에 대기하기 전에 각 클라이언트가 병렬로 호출할 수 있는 허브 메서드의 최대 수입니다. |
옵션 델리게이트를 AddSignalR
호출 시 제공함으로써 Startup.ConfigureServices
에서 모든 허브의 옵션을 구성할 수 있습니다.
public void ConfigureServices(IServiceCollection services)
{
services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
}
단일 허브에 대한 옵션은 제공된 전역 옵션 AddSignalR
을(를) 재정의하고, AddHubOptions을(를) 사용하여 구성할 수 있습니다.
services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
고급 HTTP 구성 옵션
전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성하는 데 사용합니다 HttpConnectionDispatcherOptions
. 이러한 옵션은 MapHub에 대리자를 전달하여 Startup.Configure
에서 구성됩니다.
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
});
});
}
다음 표에서는 ASP.NET Core SignalR의 고급 HTTP 옵션을 구성하는 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ApplicationMaxBufferSize |
32KB | 백프레어를 적용하기 전에 서버가 버퍼링하는 클라이언트에서 받은 최대 바이트 수입니다. 이 값을 늘리면 서버가 백프레서를 적용하지 않고도 더 큰 메시지를 더 빠르게 받을 수 있지만 메모리 사용량이 증가할 수 있습니다. |
AuthorizationData |
허브 클래스에 Authorize 적용된 특성에서 자동으로 수집되는 데이터입니다. |
클라이언트가 IAuthorizeData 허브에 연결할 권한이 있는지 확인하는 데 사용되는 개체 목록입니다. |
TransportMaxBufferSize |
32KB | 서버가 역압을 감지하기 전에 버퍼링하는 앱에서 전송한 최대 바이트 수입니다. 이 값을 늘리면 서버가 백프레어를 기다리지 않고 더 큰 메시지를 더 빠르게 버퍼링할 수 있지만 메모리 사용량이 증가할 수 있습니다. |
Transports |
모든 전송이 활성화되었습니다. | 클라이언트가 연결에 사용할 수 있는 전송 수단을 제한할 수 있는 HttpTransportType 값의 비트 플래그 열거형입니다. |
LongPolling |
아래를 참조하세요. | 긴 폴링 전송 방식과 관련된 추가 옵션입니다. |
WebSockets |
아래를 참조하세요. | WebSockets 전송과 관련된 추가 옵션입니다. |
MinimumProtocolVersion |
0 | 협상 프로토콜의 최소 버전을 지정합니다. 클라이언트를 최신 버전으로 제한하는 데 사용됩니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 단일 폴링 요청을 종료하기 전에 서버가 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 설문 조사 요청을 더 자주 실행하게 됩니다. |
WebSocket 전송에는 속성을 사용하여 WebSockets
구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫히면 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
헤더를 사용자 정의 값으로 설정하는 Sec-WebSocket-Protocol 에 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 형식( HubConnectionBuilder
.NET 및 JavaScript 클라이언트에서 사용 가능)에서 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만, 작성기 구성 옵션은 HttpHubConnectionBuilder
서브클래스에 포함되어 있으며, HubConnection
자체에도 포함되어 있습니다.
로깅 구성
로깅은 .NET 클라이언트에서 ConfigureLogging
메서드를 사용하여 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 것과 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core의 로깅 설명서를 참조하세요.
비고
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 문서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 NuGet 패키지를 설치 Microsoft.Extensions.Logging.Console
합니다. 확장 메서드를 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 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 나열합니다. 기록될 configureLogging
로그 수준을 설정하기 위해 제공하는 값입니다. 이 수준에서 기록된 메시지 또는 테이블에 나열된 수준이 기록됩니다.
문자열 | 로그레벨 |
---|---|
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 클라이언트는 SignalR 로깅에 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 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 transport
필드를 withUrl
에 제공된 옵션 객체에서 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 withTransport
의 HttpHubConnectionBuilder
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
비고
Java 클라이언트는 SignalR 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
요청과 함께 SignalR 인증 데이터를 제공하려면 JavaScript에서 옵션을AccessTokenProvider
사용하여 accessTokenFactory
원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP "Bearer 인증" 토큰으로 전달됩니다(Authorization
헤더를 Bearer
형식으로 사용하여). JavaScript 클라이언트에서 액세스 토큰은 브라우저 API가 헤더를 적용하는 기능(특히 Server-Sent 이벤트 및 WebSockets 요청)을 제한하는 몇 가지 경우를 제외하고 전달자 토큰으로 사용됩니다. 이러한 경우 액세스 토큰은 쿼리 문자열 값 access_token
으로 제공됩니다.
.NET 클라이언트에서 옵션은 다음의 AccessTokenProvider
옵션 대리자를 사용하여 지정할 수 있습니다.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를 사용하여 RxJava단일<문자열>을 제공합니다. 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 (onclose JavaScript). 이 값 은 서버에서 ping 메시지를 보내고 시간 제한 간격 내에 클라이언트가 수신할 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하기 위해 서버 값의 KeepAliveInterval 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크의 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 이벤트를 트리거합니다 Closed (onclose JavaScript). 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트가 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머가 간격의 시작으로 다시 설정됩니다. 클라이언트가 서버의 집합에 ClientTimeoutInterval 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊긴 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 값으로 TimeSpan
지정됩니다.
추가 옵션 구성
Java 클라이언트에서는 WithUrl
메서드의 withUrl
(HubConnectionBuilder
는 JavaScript) 또는 다양한 구성 HttpHubConnectionBuilder
API에서 추가 옵션을 구성할 수 있습니다.
.NET 옵션 | 기본값 | 설명 |
---|---|---|
AccessTokenProvider |
null |
HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다. |
SkipNegotiation |
false |
협상 단계를 건너뛰도록 true 설정합니다.
WebSockets 전송이 유일하게 사용하도록 설정된 전송인 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용할 수 없습니다. |
ClientCertificates |
비어 있는 | 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다. |
Cookies |
비어 있는 | 모든 HTTP 요청과 함께 보낼 HTTP 쿠키의 컬렉션입니다. |
Credentials |
비어 있는 | 모든 HTTP 요청과 함께 보낼 자격 증명입니다. |
CloseTimeout |
5초 | WebSockets만 해당합니다. 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다. |
Headers |
비어 있는 | 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다. |
HttpMessageHandlerFactory |
null |
HTTP 요청을 보내는 데 사용되는 HttpMessageHandler 를 구성하거나 대체할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다.
처리기를 바꿀 때 제공된 처리기에서 유지하려는 설정을 복사해야 합니다. 그렇지 않으면 구성된 옵션(예: 쿠키 및 헤더)이 새 처리기에 적용되지 않습니다. |
Proxy |
null |
HTTP 요청을 보낼 때 사용할 HTTP 프록시입니다. |
UseDefaultCredentials |
false |
HTTP 및 WebSockets 요청에 대한 기본 자격 증명을 보내려면 이 불리언 값을 설정합니다. 이렇게 하면 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 는 메시지를 인코딩하기 위한 두 가지 프로토콜인 JSON 및 MessagePack을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
AddJsonProtocol 확장 메서드를 사용하여 JSON serialization을 서버에서 구성할 수 있습니다.
AddJsonProtocol
에서 AddSignalR 뒤에 Program.cs
를 추가할 수 있습니다. 메서드는 AddJsonProtocol
개체를 받는 대리자를 options
사용합니다.
PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어, 속성 이름의 대소문자를 기본 카멜 표기법 대신 변경하지 않도록 직렬 변환기를 구성하려면 Program.cs
에 다음 코드를 사용합니다.
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET 클라이언트에서 동일한 AddJsonProtocol
확장 메서드가 있습니다 HubConnectionBuilder.
Microsoft.Extensions.DependencyInjection
확장 메서드를 확인하려면 네임스페이스를 가져와야 합니다.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
비고
지금은 JavaScript 클라이언트에서 JSON serialization을 구성할 수 없습니다.
Newtonsoft.Json으로 전환
Newtonsoft.Json
에서 지원되지 않는 System.Text.Json
의 기능이 필요한 경우, Newtonsoft.Json
로 전환Newtonsoft.Json
을 참조하세요.
MessagePack 직렬화 옵션
MessagePack serialization은 AddMessagePackProtocol 호출에 델리게이트를 제공하여 구성할 수 있습니다. 자세한 내용은 MessagePack in을 SignalR 참조하세요.
비고
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 허브를 구성하는 SignalR 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격에 메시지(keep-alive 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되려면 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 값의 KeepAliveInterval 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다.
KeepAliveInterval 를 변경할 때, 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경하세요. 권장 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대한 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
이 경우 true 허브 메서드에서 예외가 throw될 때 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문입니다 false . |
StreamBufferCapacity |
10 |
클라이언트 업로드 스트림에 대해 버퍼링할 수 있는 최대 항목 수입니다. 이 제한에 도달하면 서버가 스트림 항목을 처리할 때까지 호출 처리가 차단됩니다. |
MaximumReceiveMessageSize |
32KB | 단일 들어오는 허브 메시지의 최대 크기입니다. 값을 늘리면 DoS(서비스 거부) 공격의 위험이 증가할 수 있습니다. |
MaximumParallelInvocationsPerClient |
1 | 큐에 대기하기 전에 각 클라이언트가 병렬로 호출할 수 있는 허브 메서드의 최대 수입니다. |
옵션 델리게이트를 AddSignalR
호출 시 제공함으로써 Program.cs
에서 모든 허브의 옵션을 구성할 수 있습니다.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
단일 허브에 대한 옵션은 제공된 전역 옵션 AddSignalR
을(를) 재정의하고, AddHubOptions을(를) 사용하여 구성할 수 있습니다.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
고급 HTTP 구성 옵션
전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성하는 데 사용합니다 HttpConnectionDispatcherOptions
. 이러한 옵션은 MapHub에 대리자를 전달하여 Program.cs
에서 구성됩니다.
using Microsoft.AspNetCore.Http.Connections;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddSignalR();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
options.Transports =
HttpTransportType.WebSockets |
HttpTransportType.LongPolling;
}
);
app.Run();
다음 표에서는 ASP.NET Core SignalR의 고급 HTTP 옵션을 구성하는 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ApplicationMaxBufferSize |
64KB | 백프레어를 적용하기 전에 서버가 버퍼링하는 클라이언트에서 받은 최대 바이트 수입니다. 이 값을 늘리면 서버가 백프레서를 적용하지 않고 더 큰 메시지를 더 빠르게 받을 수 있지만 메모리 사용량이 증가할 수 있습니다. |
TransportMaxBufferSize |
64KB | 서버가 역압을 감지하기 전에 버퍼링하는 앱에서 전송한 최대 바이트 수입니다. 이 값을 늘리면 서버가 백프레어를 기다리지 않고 더 큰 메시지를 더 빠르게 버퍼링할 수 있지만 메모리 사용량이 증가할 수 있습니다. |
AuthorizationData |
허브 클래스에 Authorize 적용된 특성에서 자동으로 수집되는 데이터입니다. |
클라이언트가 IAuthorizeData 허브에 연결할 권한이 있는지 확인하는 데 사용되는 개체 목록입니다. |
Transports |
모든 전송이 활성화되었습니다. | 클라이언트가 연결에 사용할 수 있는 전송 수단을 제한할 수 있는 HttpTransportType 값의 비트 플래그 열거형입니다. |
LongPolling |
아래를 참조하세요. | 긴 폴링 전송 방식과 관련된 추가 옵션입니다. |
WebSockets |
아래를 참조하세요. | WebSockets 전송과 관련된 추가 옵션입니다. |
MinimumProtocolVersion |
0 | 협상 프로토콜의 최소 버전을 지정합니다. 클라이언트를 최신 버전으로 제한하는 데 사용됩니다. |
CloseOnAuthenticationExpiration |
거짓 | 토큰이 만료될 때 연결을 닫는 인증 만료 추적을 사용하도록 설정하려면 이 옵션을 설정합니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 단일 폴링 요청을 종료하기 전에 서버가 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 설문 조사 요청을 더 자주 실행하게 됩니다. |
WebSocket 전송에는 속성을 사용하여 WebSockets
구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫히면 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
헤더를 사용자 정의 값으로 설정하는 Sec-WebSocket-Protocol 에 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 형식( HubConnectionBuilder
.NET 및 JavaScript 클라이언트에서 사용 가능)에서 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만, 작성기 구성 옵션은 HttpHubConnectionBuilder
서브클래스에 포함되어 있으며, HubConnection
자체에도 포함되어 있습니다.
로깅 구성
로깅은 .NET 클라이언트에서 ConfigureLogging
메서드를 사용하여 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 것과 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core의 로깅 설명서를 참조하세요.
비고
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 문서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 NuGet 패키지를 설치 Microsoft.Extensions.Logging.Console
합니다. 확장 메서드를 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 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 나열합니다. 기록될 configureLogging
로그 수준을 설정하기 위해 제공하는 값입니다. 이 수준에서 기록된 메시지 또는 테이블에 나열된 수준이 기록됩니다.
문자열 | 로그레벨 |
---|---|
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 클라이언트는 SignalR 로깅에 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 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 transport
필드를 withUrl
에 제공된 옵션 객체에서 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 withTransport
의 HttpHubConnectionBuilder
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
비고
Java 클라이언트는 SignalR 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
요청과 함께 SignalR 인증 데이터를 제공하려면 JavaScript에서 옵션을AccessTokenProvider
사용하여 accessTokenFactory
원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP "Bearer 인증" 토큰으로 전달됩니다(Authorization
헤더를 Bearer
형식으로 사용하여). JavaScript 클라이언트에서 액세스 토큰은 브라우저 API가 헤더를 적용하는 기능(특히 Server-Sent 이벤트 및 WebSockets 요청)을 제한하는 몇 가지 경우를 제외하고 전달자 토큰으로 사용됩니다. 이러한 경우 액세스 토큰은 쿼리 문자열 값 access_token
으로 제공됩니다.
.NET 클라이언트에서 옵션은 다음의 AccessTokenProvider
옵션 대리자를 사용하여 지정할 수 있습니다.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를 사용하여 RxJava단일<문자열>을 제공합니다. 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 (onclose JavaScript). 이 값 은 서버에서 ping 메시지를 보내고 시간 제한 간격 내에 클라이언트가 수신할 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하기 위해 서버 값의 KeepAliveInterval 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크의 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 이벤트를 트리거합니다 Closed (onclose JavaScript). 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트가 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머가 간격의 시작으로 다시 설정됩니다. 클라이언트가 서버의 집합에 ClientTimeoutInterval 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊긴 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 값으로 TimeSpan
지정됩니다.
추가 옵션 구성
Java 클라이언트에서는 WithUrl
메서드의 withUrl
(HubConnectionBuilder
는 JavaScript) 또는 다양한 구성 HttpHubConnectionBuilder
API에서 추가 옵션을 구성할 수 있습니다.
.NET 옵션 | 기본값 | 설명 |
---|---|---|
AccessTokenProvider |
null |
HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다. |
SkipNegotiation |
false |
협상 단계를 건너뛰도록 true 설정합니다.
WebSockets 전송이 유일하게 사용하도록 설정된 전송인 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용할 수 없습니다. |
ClientCertificates |
비어 있는 | 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다. |
Cookies |
비어 있는 | 모든 HTTP 요청과 함께 보낼 HTTP 쿠키의 컬렉션입니다. |
Credentials |
비어 있는 | 모든 HTTP 요청과 함께 보낼 자격 증명입니다. |
CloseTimeout |
5초 | WebSockets만 해당합니다. 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다. |
Headers |
비어 있는 | 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다. |
HttpMessageHandlerFactory |
null |
HTTP 요청을 보내는 데 사용되는 HttpMessageHandler 를 구성하거나 대체할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다.
처리기를 바꿀 때 제공된 처리기에서 유지하려는 설정을 복사해야 합니다. 그렇지 않으면 구성된 옵션(예: 쿠키 및 헤더)이 새 처리기에 적용되지 않습니다. |
Proxy |
null |
HTTP 요청을 보낼 때 사용할 HTTP 프록시입니다. |
UseDefaultCredentials |
false |
HTTP 및 WebSockets 요청에 대한 기본 자격 증명을 보내려면 이 불리언 값을 설정합니다. 이렇게 하면 Windows 인증을 사용할 수 있습니다. |
WebSocketConfiguration |
null |
추가 WebSocket 옵션을 구성하는 데 사용할 수 있는 대리자입니다. 옵션을 구성하는 데 사용할 수 있는 인스턴스 ClientWebSocketOptions 를 받습니다. |
ApplicationMaxBufferSize |
1MB | 백프레어를 적용하기 전에 클라이언트가 버퍼링하는 서버에서 받은 최대 바이트 수입니다. 이 값을 늘리면 클라이언트가 백프레서를 적용하지 않고 더 큰 메시지를 더 빠르게 받을 수 있지만 메모리 사용량이 증가할 수 있습니다. |
TransportMaxBufferSize |
1MB | 사용자 애플리케이션이 보낸 데이터를 클라이언트가 버퍼링할 때 역압을 관찰하기 전에 버퍼링되는 최대 바이트 수입니다. 이 값을 늘리면 클라이언트가 백프레어를 기다리지 않고 더 큰 메시지를 더 빠르게 버퍼링할 수 있지만 메모리 사용량이 증가할 수 있습니다. |
이 옵션은 .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 는 메시지를 인코딩하기 위한 두 가지 프로토콜인 JSON 및 MessagePack을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
AddJsonProtocol 확장 메서드를 사용하여 JSON serialization을 서버에서 구성할 수 있습니다.
AddJsonProtocol
에서 AddSignalR 뒤에 Startup.ConfigureServices
를 추가할 수 있습니다. 메서드는 AddJsonProtocol
개체를 받는 대리자를 options
사용합니다.
PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어, 속성 이름의 대소문자를 기본 카멜 표기법 대신 변경하지 않도록 직렬 변환기를 구성하려면 Program.cs
에 다음 코드를 사용합니다.
builder.Services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
});
.NET 클라이언트에서 동일한 AddJsonProtocol
확장 메서드가 있습니다 HubConnectionBuilder.
Microsoft.Extensions.DependencyInjection
확장 메서드를 확인하려면 네임스페이스를 가져와야 합니다.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerOptions.PropertyNamingPolicy = null;
})
.Build();
비고
지금은 JavaScript 클라이언트에서 JSON serialization을 구성할 수 없습니다.
Newtonsoft.Json으로 전환
Newtonsoft.Json
에서 지원되지 않는 System.Text.Json
의 기능이 필요한 경우, Newtonsoft.Json
로 전환Newtonsoft.Json
을 참조하세요.
MessagePack 직렬화 옵션
MessagePack serialization은 AddMessagePackProtocol 호출에 델리게이트를 제공하여 구성할 수 있습니다. 자세한 내용은 MessagePack in을 SignalR 참조하세요.
비고
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 허브를 구성하는 SignalR 옵션에 대해 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격에 메시지(keep-alive 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되려면 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 값의 KeepAliveInterval 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다.
KeepAliveInterval 를 변경할 때, 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경하세요. 권장 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대한 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
이 경우 true 허브 메서드에서 예외가 throw될 때 자세한 예외 메시지가 클라이언트에 반환됩니다. 기본값은 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문입니다 false . |
StreamBufferCapacity |
10 |
클라이언트 업로드 스트림에 대해 버퍼링할 수 있는 최대 항목 수입니다. 이 제한에 도달하면 서버가 스트림 항목을 처리할 때까지 호출 처리가 차단됩니다. |
MaximumReceiveMessageSize |
32KB | 단일 들어오는 허브 메시지의 최대 크기입니다. 값을 늘리면 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 |
허브 클래스에 Authorize 적용된 특성에서 자동으로 수집되는 데이터입니다. |
클라이언트가 IAuthorizeData 허브에 연결할 권한이 있는지 확인하는 데 사용되는 개체 목록입니다. |
Transports |
모든 전송이 활성화되었습니다. | 클라이언트가 연결에 사용할 수 있는 전송 수단을 제한할 수 있는 HttpTransportType 값의 비트 플래그 열거형입니다. |
LongPolling |
아래를 참조하세요. | 긴 폴링 전송 방식과 관련된 추가 옵션입니다. |
WebSockets |
아래를 참조하세요. | WebSockets 전송과 관련된 추가 옵션입니다. |
MinimumProtocolVersion |
0 | 협상 프로토콜의 최소 버전을 지정합니다. 클라이언트를 최신 버전으로 제한하는 데 사용됩니다. |
CloseOnAuthenticationExpiration |
거짓 | 토큰이 만료될 때 연결을 닫는 인증 만료 추적을 사용하도록 설정하려면 이 옵션을 설정합니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 단일 폴링 요청을 종료하기 전에 서버가 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 설문 조사 요청을 더 자주 실행하게 됩니다. |
WebSocket 전송에는 속성을 사용하여 WebSockets
구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫히면 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
헤더를 사용자 정의 값으로 설정하는 Sec-WebSocket-Protocol 에 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 형식( HubConnectionBuilder
.NET 및 JavaScript 클라이언트에서 사용 가능)에서 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만, 작성기 구성 옵션은 HttpHubConnectionBuilder
서브클래스에 포함되어 있으며, HubConnection
자체에도 포함되어 있습니다.
로깅 구성
로깅은 .NET 클라이언트에서 ConfigureLogging
메서드를 사용하여 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 것과 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core의 로깅 설명서를 참조하세요.
비고
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 문서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 NuGet 패키지를 설치 Microsoft.Extensions.Logging.Console
합니다. 확장 메서드를 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 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 나열합니다. 기록될 configureLogging
로그 수준을 설정하기 위해 제공하는 값입니다. 이 수준에서 기록된 메시지 또는 테이블에 나열된 수준이 기록됩니다.
문자열 | 로그레벨 |
---|---|
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 클라이언트는 SignalR 로깅에 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 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 transport
필드를 withUrl
에 제공된 옵션 객체에서 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 withTransport
의 HttpHubConnectionBuilder
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
비고
Java 클라이언트는 SignalR 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
요청과 함께 SignalR 인증 데이터를 제공하려면 JavaScript에서 옵션을AccessTokenProvider
사용하여 accessTokenFactory
원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP "Bearer 인증" 토큰으로 전달됩니다(Authorization
헤더를 Bearer
형식으로 사용하여). JavaScript 클라이언트에서 액세스 토큰은 브라우저 API가 헤더를 적용하는 기능(특히 Server-Sent 이벤트 및 WebSockets 요청)을 제한하는 몇 가지 경우를 제외하고 전달자 토큰으로 사용됩니다. 이러한 경우 액세스 토큰은 쿼리 문자열 값 access_token
으로 제공됩니다.
.NET 클라이언트에서 옵션은 다음의 AccessTokenProvider
옵션 대리자를 사용하여 지정할 수 있습니다.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를 사용하여 RxJava단일<문자열>을 제공합니다. 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 (onclose JavaScript). 이 값 은 서버에서 ping 메시지를 보내고 시간 제한 간격 내에 클라이언트가 수신할 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하기 위해 서버 값의 KeepAliveInterval 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크의 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 이벤트를 트리거합니다 Closed (onclose JavaScript). 이는 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 허브 프로토콜 사양을SignalR 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트가 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머가 간격의 시작으로 다시 설정됩니다. 클라이언트가 서버의 집합에 ClientTimeoutInterval 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊긴 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 값으로 TimeSpan
지정됩니다.
추가 옵션 구성
Java 클라이언트에서는 WithUrl
메서드의 withUrl
(HubConnectionBuilder
는 JavaScript) 또는 다양한 구성 HttpHubConnectionBuilder
API에서 추가 옵션을 구성할 수 있습니다.
.NET 옵션 | 기본값 | 설명 |
---|---|---|
AccessTokenProvider |
null |
HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다. |
SkipNegotiation |
false |
협상 단계를 건너뛰도록 true 설정합니다.
WebSockets 전송이 유일하게 사용하도록 설정된 전송인 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용할 수 없습니다. |
ClientCertificates |
비어 있는 | 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다. |
Cookies |
비어 있는 | 모든 HTTP 요청과 함께 보낼 HTTP 쿠키의 컬렉션입니다. |
Credentials |
비어 있는 | 모든 HTTP 요청과 함께 보낼 자격 증명입니다. |
CloseTimeout |
5초 | WebSockets만 해당합니다. 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다. |
Headers |
비어 있는 | 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다. |
HttpMessageHandlerFactory |
null |
HTTP 요청을 보내는 데 사용되는 HttpMessageHandler 를 구성하거나 대체할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다.
처리기를 바꿀 때 제공된 처리기에서 유지하려는 설정을 복사해야 합니다. 그렇지 않으면 구성된 옵션(예: 쿠키 및 헤더)이 새 처리기에 적용되지 않습니다. |
Proxy |
null |
HTTP 요청을 보낼 때 사용할 HTTP 프록시입니다. |
UseDefaultCredentials |
false |
HTTP 및 WebSockets 요청에 대한 기본 자격 증명을 보내려면 이 불리언 값을 설정합니다. 이렇게 하면 Windows 인증을 사용할 수 있습니다. |
WebSocketConfiguration |
null |
추가 WebSocket 옵션을 구성하는 데 사용할 수 있는 대리자입니다. 옵션을 구성하는 데 사용할 수 있는 인스턴스 ClientWebSocketOptions 를 받습니다. |
ApplicationMaxBufferSize |
1MB | 백프레어를 적용하기 전에 클라이언트가 버퍼링하는 서버에서 받은 최대 바이트 수입니다. 이 값을 늘리면 클라이언트가 백프레서를 적용하지 않고 더 큰 메시지를 더 빠르게 받을 수 있지만 메모리 사용량이 증가할 수 있습니다. |
TransportMaxBufferSize |
1MB | 사용자 애플리케이션이 보낸 데이터를 클라이언트가 버퍼링할 때 역압을 관찰하기 전에 버퍼링되는 최대 바이트 수입니다. 이 값을 늘리면 클라이언트가 백프레어를 기다리지 않고 더 큰 메시지를 더 빠르게 버퍼링할 수 있지만 메모리 사용량이 증가할 수 있습니다. |
이 옵션은 .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