ASP.NET Core SignalR 구성
이 문서에서는 ASP.NET Core SignalR 구성에 대해 설명합니다.
BlazorSignalR 이 문서의 지침을 추가하거나 대체하는 지침은 ASP.NET Core BlazorSignalR 지침을 참조하세요.
JSON/MessagePack serialization 옵션
ASP.NET Core SignalR은 메시지 인코딩을 위해 JSON 및 MessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
확장 메서드를 사용하여 서버에서 JSON serialization을 AddJsonProtocol 구성할 수 있습니다. AddJsonProtocol
을 Startup.ConfigureServices
에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol
메서드는 options
개체를 받는 대리자를 가져옵니다. PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다 System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어 기본 카멜 대/소문자 이름이 아닌 속성 이름의 대/소문자를 변경하지 않도록 serializer를 구성하려면 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으로 전환
System.Text.Json
에서 지원되지 않는 Newtonsoft.Json
의 기능이 필요한 경우 Newtonsoft.Json
으로 전환을 참조하세요.
MessagePack serialization 옵션
MessagePack serialization은 호출에 대리 AddMessagePackProtocol 자를 제공하여 구성할 수 있습니다. 자세한 내용은 SignalR의 MessagePack을 참조하세요.
참고 항목
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 SignalR 허브를 구성하기 위한 옵션을 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격으로 메시지(연결 유지 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되기까지 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 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에서 확인됩니다. |
Program.cs
에서 AddSignalR
호출에 옵션 대리자를 제공하여 모든 허브에 대해 옵션을 구성할 수 있습니다.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
단일 허브에 대한 옵션은 AddSignalR
에 제공된 전역 옵션을 재정의하며 AddHubOptions를 사용하여 구성할 수 있습니다.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
고급 HTTP 구성 옵션
HttpConnectionDispatcherOptions
를 사용하여 전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성합니다. 이러한 옵션은 Program.cs
에서 MapHub에 대리자를 전달하여 구성합니다.
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 |
false | 토큰이 만료될 때 연결을 닫는 인증 만료 추적을 사용하도록 설정하려면 이 옵션을 설정합니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 서버가 단일 폴링 요청을 종료하기 전에 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 폴링 요청을 더 자주 발급합니다. |
WebSocket 전송에는 WebSockets
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫힌 후 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
Sec-WebSocket-Protocol 헤더를 사용자 지정 값으로 설정하는 데 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고, 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 HubConnectionBuilder
형식(.NET 및 JavaScript 클라이언트에서 사용 가능)에 대해 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만 HttpHubConnectionBuilder
서브클래스는 HubConnection
자체에 있을 뿐만 아니라 작성기 구성 옵션을 포함하는 클래스입니다.
로깅 구성
로깅은 ConfigureLogging
메서드를 사용하여 .NET 클라이언트에서 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 경우와 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core 로깅 설명서를 참조하세요.
참고 항목
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 설명서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 Microsoft.Extensions.Logging.Console
NuGet 패키지를 설치합니다. 다음과 같이 AddConsole
확장 메서드를 호출합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
JavaScript 클라이언트에도 비슷한 configureLogging
메서드가 있습니다. 생성할 로그 메시지의 최소 수준을 나타내는 LogLevel
값을 제공합니다. 로그는 브라우저 콘솔 창에 기록됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
값 대신, 로그 수준 이름을 나타내는 string
값을 제공할 수도 있습니다. LogLevel
상수에 대한 액세스 권한이 없는 환경에서 SignalR 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 보여 줍니다. 사용자가 configureLogging
에 제공하는 값은 로깅할 최소 로그 수준을 설정합니다. 이 수준 또는 테이블에서 이 수준 다음에 나열되는 수준에서 로깅되는 메시지가 로깅됩니다.
문자열 | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info 또는 information |
LogLevel.Information |
warn 또는 warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
참고 항목
로깅을 완전히 비활성화하려면 configureLogging
메서드에 signalR.LogLevel.None
을 지정합니다.
로깅에 대한 자세한 내용은 SignalR 진단 설명서를 참조하세요.
SignalR Java 클라이언트는 로깅에 SLF4J 라이브러리를 사용합니다. 이것은 라이브러리 사용자가 특정 로깅 종속성을 가져와 자신의 특정 로깅 구현을 선택할 수 있게 해 주는 상위 수준 로깅 API입니다. 다음 코드 조각에서는 SignalR Java 클라이언트에서 java.util.logging
을 사용하는 방법을 보여 줍니다.
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 이벤트 전송을 사용하지 않도록 설정하지만 WebSockets 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 withUrl
에 제공된 옵션 개체에서 transport
필드를 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 HttpHubConnectionBuilder
의 withTransport
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
참고 항목
SignalR Java 클라이언트는 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
SignalR 요청과 함께 인증 데이터를 제공하려면 AccessTokenProvider
옵션(JavaScript의 경우 accessTokenFactory
)을 사용하여 원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP “전달자 인증” 토큰으로 전달됩니다(Bearer
형식에 Authorization
헤더 사용). 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 클라이언트에서 액세스 토큰은 withUrl
의 옵션 개체에서 accessTokenFactory
필드를 설정하여 구성됩니다.
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 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하는 서버의 연결 유지 간격(WithKeepAliveInterval ) 값의 두 배 이상의 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한이며 개체 자체에서 HubConnection 사용할 수 있습니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 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)를 승인합니다.
- 연결이 종료된 시점을 인식하고 연결이 중단된 동안 전송되었을 수 있는 메시지를 재생합니다.
상태 저장 다시 연결은 ASP.NET Core 8.0 이상에서 사용할 수 있습니다.
서버 허브 엔드포인트와 클라이언트 모두에서 상태 저장 다시 연결에 옵트인합니다.
다음 옵션을 사용하도록 서버 허브 엔드포인트 구성을 업데이트합니다.
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바이트인 선택 사항입니다.
추가 옵션 구성
추가 옵션은 HubConnectionBuilder
의 WithUrl
(JavaScript의 경우 withUrl
) 메서드 또는 Java 클라이언트의 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 클라이언트에서 이러한 옵션은 HubConnectionBuilder.create("HUB URL")
에서 반환된 HttpHubConnectionBuilder
의 메서드를 사용하여 구성할 수 있습니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
추가 리소스
JSON/MessagePack serialization 옵션
ASP.NET Core SignalR은 메시지 인코딩을 위해 JSON 및 MessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
확장 메서드를 사용하여 서버에서 JSON serialization을 AddJsonProtocol 구성할 수 있으며, 이 메서드는 메서드에 Startup.ConfigureServices
추가 AddSignalR 될 수 있습니다. AddJsonProtocol
메서드는 options
개체를 받는 대리자를 가져옵니다. PayloadSerializerSettings 해당 개체의 속성은 인수 및 반환 값의 serialization을 구성하는 데 사용할 수 있는 Json.NET JsonSerializerSettings
개체입니다. 자세한 내용은 Json.NET 설명서를 참조하세요.
예를 들어 기본 카멜 대/소문자 이름이 아닌 “PascalCase” 속성 이름을 사용하도록 serializer를 구성하려면 Startup.ConfigureServices
에서 다음 코드를 사용합니다.
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
.NET 클라이언트에서 동일한 AddJsonProtocol
확장 메서드가 있습니다 HubConnectionBuilder. 확장 메서드를 확인하려면 Microsoft.Extensions.DependencyInjection
네임스페이스를 가져와야 합니다.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
참고 항목
지금은 JavaScript 클라이언트에서 JSON serialization을 구성할 수 없습니다.
MessagePack serialization 옵션
MessagePack serialization은 호출에 대리 AddMessagePackProtocol 자를 제공하여 구성할 수 있습니다. 자세한 내용은 SignalR의 MessagePack을 참조하세요.
참고 항목
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 SignalR 허브를 구성하기 위한 옵션을 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다. KeepAliveInterval 을 변경할 때 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경합니다. 권장되는 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대해 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
true 인 경우 허브 메서드에서 예외가 throw되면 자세한 예외 메시지가 클라이언트에 반환됩니다. 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문에 기본값은 false 입니다. |
Startup.ConfigureServices
에서 AddSignalR
호출에 옵션 대리자를 제공하여 모든 허브에 대해 옵션을 구성할 수 있습니다.
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
를 사용하여 전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성합니다. 이러한 옵션은 Startup.Configure
에서 MapHub에 대리자를 전달하여 구성합니다.
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
자체에 있을 뿐만 아니라 작성기 구성 옵션을 포함하는 클래스입니다.
로깅 구성
로깅은 ConfigureLogging
메서드를 사용하여 .NET 클라이언트에서 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 경우와 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core 로깅 설명서를 참조하세요.
참고 항목
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 설명서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 Microsoft.Extensions.Logging.Console
NuGet 패키지를 설치합니다. 다음과 같이 AddConsole
확장 메서드를 호출합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
JavaScript 클라이언트에도 비슷한 configureLogging
메서드가 있습니다. 생성할 로그 메시지의 최소 수준을 나타내는 LogLevel
값을 제공합니다. 로그는 브라우저 콘솔 창에 기록됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
참고 항목
로깅을 완전히 비활성화하려면 configureLogging
메서드에 signalR.LogLevel.None
을 지정합니다.
로깅에 대한 자세한 내용은 SignalR 진단 설명서를 참조하세요.
SignalR Java 클라이언트는 로깅에 SLF4J 라이브러리를 사용합니다. 이것은 라이브러리 사용자가 특정 로깅 종속성을 가져와 자신의 특정 로깅 구현을 선택할 수 있게 해 주는 상위 수준 로깅 API입니다. 다음 코드 조각에서는 SignalR Java 클라이언트에서 java.util.logging
을 사용하는 방법을 보여 줍니다.
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 이벤트 전송을 사용하지 않도록 설정하지만 WebSockets 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 withUrl
에 제공된 옵션 개체에서 transport
필드를 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
전달자 인증 구성
SignalR 요청과 함께 인증 데이터를 제공하려면 AccessTokenProvider
옵션(JavaScript의 경우 accessTokenFactory
)을 사용하여 원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP “전달자 인증” 토큰으로 전달됩니다(Bearer
형식에 Authorization
헤더 사용). 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 클라이언트에서 액세스 토큰은 withUrl
의 옵션 개체에서 accessTokenFactory
필드를 설정하여 구성됩니다.
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 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
.NET 클라이언트에서 시간 제한 값은 TimeSpan
값으로 지정됩니다.
추가 옵션 구성
추가 옵션은 HubConnectionBuilder
의 WithUrl
(JavaScript의 경우 withUrl
) 메서드 또는 Java 클라이언트의 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 클라이언트에서 이러한 옵션은 HubConnectionBuilder.create("HUB URL")
에서 반환된 HttpHubConnectionBuilder
의 메서드를 사용하여 구성할 수 있습니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
추가 리소스
JSON/MessagePack serialization 옵션
ASP.NET Core SignalR은 메시지 인코딩을 위해 JSON 및 MessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
확장 메서드를 사용하여 서버에서 JSON serialization을 AddJsonProtocol 구성할 수 있으며, 이 메서드는 메서드에 Startup.ConfigureServices
추가 AddSignalR 될 수 있습니다. AddJsonProtocol
메서드는 options
개체를 받는 대리자를 가져옵니다. PayloadSerializerSettings 해당 개체의 속성은 인수 및 반환 값의 serialization을 구성하는 데 사용할 수 있는 Json.NET JsonSerializerSettings
개체입니다. 자세한 내용은 Json.NET 설명서를 참조하세요.
예를 들어 기본 카멜 대/소문자 이름이 아닌 “PascalCase” 속성 이름을 사용하도록 serializer를 구성하려면 Startup.ConfigureServices
에서 다음 코드를 사용합니다.
services.AddSignalR()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
});
.NET 클라이언트에서 동일한 AddJsonProtocol
확장 메서드가 있습니다 HubConnectionBuilder. 확장 메서드를 확인하려면 Microsoft.Extensions.DependencyInjection
네임스페이스를 가져와야 합니다.
// At the top of the file:
using Microsoft.Extensions.DependencyInjection;
// When constructing your connection:
var connection = new HubConnectionBuilder()
.AddJsonProtocol(options => {
options.PayloadSerializerSettings.ContractResolver =
new DefaultContractResolver();
})
.Build();
참고 항목
지금은 JavaScript 클라이언트에서 JSON serialization을 구성할 수 없습니다.
MessagePack serialization 옵션
MessagePack serialization은 호출에 대리 AddMessagePackProtocol 자를 제공하여 구성할 수 있습니다. 자세한 내용은 SignalR의 MessagePack을 참조하세요.
참고 항목
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 SignalR 허브를 구성하기 위한 옵션을 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격으로 메시지(연결 유지 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되기까지 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 KeepAliveInterval 값의 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다. KeepAliveInterval 을 변경할 때 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경합니다. 권장되는 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대해 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
true 인 경우 허브 메서드에서 예외가 throw되면 자세한 예외 메시지가 클라이언트에 반환됩니다. 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문에 기본값은 false 입니다. |
Startup.ConfigureServices
에서 AddSignalR
호출에 옵션 대리자를 제공하여 모든 허브에 대해 옵션을 구성할 수 있습니다.
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
를 사용하여 전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성합니다. 이러한 옵션은 Startup.Configure
에서 MapHub에 대리자를 전달하여 구성합니다.
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
자체에 있을 뿐만 아니라 작성기 구성 옵션을 포함하는 클래스입니다.
로깅 구성
로깅은 ConfigureLogging
메서드를 사용하여 .NET 클라이언트에서 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 경우와 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core 로깅 설명서를 참조하세요.
참고 항목
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 설명서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 Microsoft.Extensions.Logging.Console
NuGet 패키지를 설치합니다. 다음과 같이 AddConsole
확장 메서드를 호출합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
JavaScript 클라이언트에도 비슷한 configureLogging
메서드가 있습니다. 생성할 로그 메시지의 최소 수준을 나타내는 LogLevel
값을 제공합니다. 로그는 브라우저 콘솔 창에 기록됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
참고 항목
로깅을 완전히 비활성화하려면 configureLogging
메서드에 signalR.LogLevel.None
을 지정합니다.
로깅에 대한 자세한 내용은 SignalR 진단 설명서를 참조하세요.
SignalR Java 클라이언트는 로깅에 SLF4J 라이브러리를 사용합니다. 이것은 라이브러리 사용자가 특정 로깅 종속성을 가져와 자신의 특정 로깅 구현을 선택할 수 있게 해 주는 상위 수준 로깅 API입니다. 다음 코드 조각에서는 SignalR Java 클라이언트에서 java.util.logging
을 사용하는 방법을 보여 줍니다.
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 이벤트 전송을 사용하지 않도록 설정하지만 WebSockets 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 withUrl
에 제공된 옵션 개체에서 transport
필드를 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
전달자 인증 구성
SignalR 요청과 함께 인증 데이터를 제공하려면 AccessTokenProvider
옵션(JavaScript의 경우 accessTokenFactory
)을 사용하여 원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP “전달자 인증” 토큰으로 전달됩니다(Bearer
형식에 Authorization
헤더 사용). 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 클라이언트에서 액세스 토큰은 withUrl
의 옵션 개체에서 accessTokenFactory
필드를 설정하여 구성됩니다.
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 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval 에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 TimeSpan
값으로 지정됩니다.
추가 옵션 구성
추가 옵션은 HubConnectionBuilder
의 WithUrl
(JavaScript의 경우 withUrl
) 메서드 또는 Java 클라이언트의 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 클라이언트에서 이러한 옵션은 HubConnectionBuilder.create("HUB URL")
에서 반환된 HttpHubConnectionBuilder
의 메서드를 사용하여 구성할 수 있습니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
추가 리소스
JSON/MessagePack serialization 옵션
ASP.NET Core SignalR은 메시지 인코딩을 위해 JSON 및 MessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
확장 메서드를 사용하여 서버에서 JSON serialization을 AddJsonProtocol 구성할 수 있습니다. AddJsonProtocol
을 Startup.ConfigureServices
에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol
메서드는 options
개체를 받는 대리자를 가져옵니다. PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다 System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어 기본 카멜 대/소문자 이름이 아닌 속성 이름의 대/소문자를 변경하지 않도록 serializer를 구성하려면 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으로 전환
System.Text.Json
에서 지원되지 않는 Newtonsoft.Json
의 기능이 필요한 경우 Newtonsoft.Json
으로 전환을 참조하세요.
MessagePack serialization 옵션
MessagePack serialization은 호출에 대리 AddMessagePackProtocol 자를 제공하여 구성할 수 있습니다. 자세한 내용은 SignalR의 MessagePack을 참조하세요.
참고 항목
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 SignalR 허브를 구성하기 위한 옵션을 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격으로 메시지(연결 유지 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되기까지 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 KeepAliveInterval 값의 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다. KeepAliveInterval 을 변경할 때 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경합니다. 권장되는 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대해 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
true 인 경우 허브 메서드에서 예외가 throw되면 자세한 예외 메시지가 클라이언트에 반환됩니다. 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문에 기본값은 false 입니다. |
StreamBufferCapacity |
10 |
클라이언트 업로드 스트림에 대해 버퍼링할 수 있는 최대 항목 수입니다. 이 제한에 도달하면 서버에서 스트림 항목을 처리할 때까지 호출 처리가 차단됩니다. |
MaximumReceiveMessageSize |
32KB | 들어오는 단일 허브 메시지의 최대 크기입니다. 값을 늘리면 DoS(서비스 거부) 공격의 위험이 증가할 수 있습니다. |
Startup.ConfigureServices
에서 AddSignalR
호출에 옵션 대리자를 제공하여 모든 허브에 대해 옵션을 구성할 수 있습니다.
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
를 사용하여 전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성합니다. 이러한 옵션은 Startup.Configure
에서 MapHub에 대리자를 전달하여 구성합니다.
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
자체에 있을 뿐만 아니라 작성기 구성 옵션을 포함하는 클래스입니다.
로깅 구성
로깅은 ConfigureLogging
메서드를 사용하여 .NET 클라이언트에서 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 경우와 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core 로깅 설명서를 참조하세요.
참고 항목
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 설명서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 Microsoft.Extensions.Logging.Console
NuGet 패키지를 설치합니다. 다음과 같이 AddConsole
확장 메서드를 호출합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
JavaScript 클라이언트에도 비슷한 configureLogging
메서드가 있습니다. 생성할 로그 메시지의 최소 수준을 나타내는 LogLevel
값을 제공합니다. 로그는 브라우저 콘솔 창에 기록됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
값 대신, 로그 수준 이름을 나타내는 string
값을 제공할 수도 있습니다. LogLevel
상수에 대한 액세스 권한이 없는 환경에서 SignalR 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 보여 줍니다. 사용자가 configureLogging
에 제공하는 값은 로깅할 최소 로그 수준을 설정합니다. 이 수준 또는 테이블에서 이 수준 다음에 나열되는 수준에서 로깅되는 메시지가 로깅됩니다.
문자열 | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info 또는 information |
LogLevel.Information |
warn 또는 warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
참고 항목
로깅을 완전히 비활성화하려면 configureLogging
메서드에 signalR.LogLevel.None
을 지정합니다.
로깅에 대한 자세한 내용은 SignalR 진단 설명서를 참조하세요.
SignalR Java 클라이언트는 로깅에 SLF4J 라이브러리를 사용합니다. 이것은 라이브러리 사용자가 특정 로깅 종속성을 가져와 자신의 특정 로깅 구현을 선택할 수 있게 해 주는 상위 수준 로깅 API입니다. 다음 코드 조각에서는 SignalR Java 클라이언트에서 java.util.logging
을 사용하는 방법을 보여 줍니다.
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 이벤트 전송을 사용하지 않도록 설정하지만 WebSockets 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 withUrl
에 제공된 옵션 개체에서 transport
필드를 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 HttpHubConnectionBuilder
의 withTransport
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
참고 항목
SignalR Java 클라이언트는 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
SignalR 요청과 함께 인증 데이터를 제공하려면 AccessTokenProvider
옵션(JavaScript의 경우 accessTokenFactory
)을 사용하여 원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP “전달자 인증” 토큰으로 전달됩니다(Bearer
형식에 Authorization
헤더 사용). 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 클라이언트에서 액세스 토큰은 withUrl
의 옵션 개체에서 accessTokenFactory
필드를 설정하여 구성됩니다.
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 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval 에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 TimeSpan
값으로 지정됩니다.
추가 옵션 구성
추가 옵션은 HubConnectionBuilder
의 WithUrl
(JavaScript의 경우 withUrl
) 메서드 또는 Java 클라이언트의 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 클라이언트에서 이러한 옵션은 HubConnectionBuilder.create("HUB URL")
에서 반환된 HttpHubConnectionBuilder
의 메서드를 사용하여 구성할 수 있습니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
추가 리소스
JSON/MessagePack serialization 옵션
ASP.NET Core SignalR은 메시지 인코딩을 위해 JSON 및 MessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
확장 메서드를 사용하여 서버에서 JSON serialization을 AddJsonProtocol 구성할 수 있습니다. AddJsonProtocol
을 Startup.ConfigureServices
에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol
메서드는 options
개체를 받는 대리자를 가져옵니다. PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다 System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어 기본 카멜 대/소문자 이름이 아닌 속성 이름의 대/소문자를 변경하지 않도록 serializer를 구성하려면 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으로 전환
System.Text.Json
에서 지원되지 않는 Newtonsoft.Json
의 기능이 필요한 경우 Newtonsoft.Json
으로 전환을 참조하세요.
MessagePack serialization 옵션
MessagePack serialization은 호출에 대리 AddMessagePackProtocol 자를 제공하여 구성할 수 있습니다. 자세한 내용은 SignalR의 MessagePack을 참조하세요.
참고 항목
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 SignalR 허브를 구성하기 위한 옵션을 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격으로 메시지(연결 유지 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되기까지 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 KeepAliveInterval 값의 두 배입니다. |
HandshakeTimeout |
15초 | 클라이언트가 이 시간 간격 내에 초기 핸드셰이크 메시지를 보내지 않으면 연결이 닫힙니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 서버가 이 간격 내에 메시지를 보내지 않은 경우 연결을 열어 두기 위해 ping 메시지가 자동으로 전송됩니다. KeepAliveInterval 을 변경할 때 클라이언트에서 ServerTimeout 또는 serverTimeoutInMilliseconds 설정을 변경합니다. 권장되는 ServerTimeout 또는 serverTimeoutInMilliseconds 값은 KeepAliveInterval 값의 두 배입니다. |
SupportedProtocols |
설치된 모든 프로토콜 | 이 허브에서 지원하는 프로토콜입니다. 기본적으로 서버에 등록된 모든 프로토콜이 허용됩니다. 개별 허브에 대해 특정 프로토콜을 사용하지 않도록 설정하려면 이 목록에서 프로토콜을 제거할 수 있습니다. |
EnableDetailedErrors |
false |
true 인 경우 허브 메서드에서 예외가 throw되면 자세한 예외 메시지가 클라이언트에 반환됩니다. 이러한 예외 메시지에 중요한 정보가 포함될 수 있기 때문에 기본값은 false 입니다. |
StreamBufferCapacity |
10 |
클라이언트 업로드 스트림에 대해 버퍼링할 수 있는 최대 항목 수입니다. 이 제한에 도달하면 서버에서 스트림 항목을 처리할 때까지 호출 처리가 차단됩니다. |
MaximumReceiveMessageSize |
32KB | 들어오는 단일 허브 메시지의 최대 크기입니다. 값을 늘리면 DoS(서비스 거부) 공격의 위험이 증가할 수 있습니다. |
Startup.ConfigureServices
에서 AddSignalR
호출에 옵션 대리자를 제공하여 모든 허브에 대해 옵션을 구성할 수 있습니다.
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
를 사용하여 전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성합니다. 이러한 옵션은 Startup.Configure
에서 MapHub에 대리자를 전달하여 구성합니다.
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
자체에 있을 뿐만 아니라 작성기 구성 옵션을 포함하는 클래스입니다.
로깅 구성
로깅은 ConfigureLogging
메서드를 사용하여 .NET 클라이언트에서 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 경우와 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core 로깅 설명서를 참조하세요.
참고 항목
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 설명서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 Microsoft.Extensions.Logging.Console
NuGet 패키지를 설치합니다. 다음과 같이 AddConsole
확장 메서드를 호출합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
JavaScript 클라이언트에도 비슷한 configureLogging
메서드가 있습니다. 생성할 로그 메시지의 최소 수준을 나타내는 LogLevel
값을 제공합니다. 로그는 브라우저 콘솔 창에 기록됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
값 대신, 로그 수준 이름을 나타내는 string
값을 제공할 수도 있습니다. LogLevel
상수에 대한 액세스 권한이 없는 환경에서 SignalR 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 보여 줍니다. 사용자가 configureLogging
에 제공하는 값은 로깅할 최소 로그 수준을 설정합니다. 이 수준 또는 테이블에서 이 수준 다음에 나열되는 수준에서 로깅되는 메시지가 로깅됩니다.
문자열 | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info 또는 information |
LogLevel.Information |
warn 또는 warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
참고 항목
로깅을 완전히 비활성화하려면 configureLogging
메서드에 signalR.LogLevel.None
을 지정합니다.
로깅에 대한 자세한 내용은 SignalR 진단 설명서를 참조하세요.
SignalR Java 클라이언트는 로깅에 SLF4J 라이브러리를 사용합니다. 이것은 라이브러리 사용자가 특정 로깅 종속성을 가져와 자신의 특정 로깅 구현을 선택할 수 있게 해 주는 상위 수준 로깅 API입니다. 다음 코드 조각에서는 SignalR Java 클라이언트에서 java.util.logging
을 사용하는 방법을 보여 줍니다.
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 이벤트 전송을 사용하지 않도록 설정하지만 WebSockets 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 withUrl
에 제공된 옵션 개체에서 transport
필드를 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 HttpHubConnectionBuilder
의 withTransport
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
참고 항목
SignalR Java 클라이언트는 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
SignalR 요청과 함께 인증 데이터를 제공하려면 AccessTokenProvider
옵션(JavaScript의 경우 accessTokenFactory
)을 사용하여 원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP “전달자 인증” 토큰으로 전달됩니다(Bearer
형식에 Authorization
헤더 사용). 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 클라이언트에서 액세스 토큰은 withUrl
의 옵션 개체에서 accessTokenFactory
필드를 설정하여 구성됩니다.
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 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval 에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 TimeSpan
값으로 지정됩니다.
추가 옵션 구성
추가 옵션은 HubConnectionBuilder
의 WithUrl
(JavaScript의 경우 withUrl
) 메서드 또는 Java 클라이언트의 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 클라이언트에서 이러한 옵션은 HubConnectionBuilder.create("HUB URL")
에서 반환된 HttpHubConnectionBuilder
의 메서드를 사용하여 구성할 수 있습니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
추가 리소스
JSON/MessagePack serialization 옵션
ASP.NET Core SignalR은 메시지 인코딩을 위해 JSON 및 MessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
확장 메서드를 사용하여 서버에서 JSON serialization을 AddJsonProtocol 구성할 수 있습니다. AddJsonProtocol
을 Startup.ConfigureServices
에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol
메서드는 options
개체를 받는 대리자를 가져옵니다. PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다 System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어 기본 카멜 대/소문자 이름이 아닌 속성 이름의 대/소문자를 변경하지 않도록 serializer를 구성하려면 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으로 전환
System.Text.Json
에서 지원되지 않는 Newtonsoft.Json
의 기능이 필요한 경우 Newtonsoft.Json
으로 전환을 참조하세요.
MessagePack serialization 옵션
MessagePack serialization은 호출에 대리 AddMessagePackProtocol 자를 제공하여 구성할 수 있습니다. 자세한 내용은 SignalR의 MessagePack을 참조하세요.
참고 항목
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 SignalR 허브를 구성하기 위한 옵션을 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격으로 메시지(연결 유지 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되기까지 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 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 | 큐에 대기하기 전에 각 클라이언트가 병렬로 호출할 수 있는 허브 메서드의 최대 수입니다. |
Startup.ConfigureServices
에서 AddSignalR
호출에 옵션 대리자를 제공하여 모든 허브에 대해 옵션을 구성할 수 있습니다.
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
를 사용하여 전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성합니다. 이러한 옵션은 Startup.Configure
에서 MapHub에 대리자를 전달하여 구성합니다.
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
자체에 있을 뿐만 아니라 작성기 구성 옵션을 포함하는 클래스입니다.
로깅 구성
로깅은 ConfigureLogging
메서드를 사용하여 .NET 클라이언트에서 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 경우와 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core 로깅 설명서를 참조하세요.
참고 항목
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 설명서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 Microsoft.Extensions.Logging.Console
NuGet 패키지를 설치합니다. 다음과 같이 AddConsole
확장 메서드를 호출합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
JavaScript 클라이언트에도 비슷한 configureLogging
메서드가 있습니다. 생성할 로그 메시지의 최소 수준을 나타내는 LogLevel
값을 제공합니다. 로그는 브라우저 콘솔 창에 기록됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
값 대신, 로그 수준 이름을 나타내는 string
값을 제공할 수도 있습니다. LogLevel
상수에 대한 액세스 권한이 없는 환경에서 SignalR 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 보여 줍니다. 사용자가 configureLogging
에 제공하는 값은 로깅할 최소 로그 수준을 설정합니다. 이 수준 또는 테이블에서 이 수준 다음에 나열되는 수준에서 로깅되는 메시지가 로깅됩니다.
문자열 | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info 또는 information |
LogLevel.Information |
warn 또는 warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
참고 항목
로깅을 완전히 비활성화하려면 configureLogging
메서드에 signalR.LogLevel.None
을 지정합니다.
로깅에 대한 자세한 내용은 SignalR 진단 설명서를 참조하세요.
SignalR Java 클라이언트는 로깅에 SLF4J 라이브러리를 사용합니다. 이것은 라이브러리 사용자가 특정 로깅 종속성을 가져와 자신의 특정 로깅 구현을 선택할 수 있게 해 주는 상위 수준 로깅 API입니다. 다음 코드 조각에서는 SignalR Java 클라이언트에서 java.util.logging
을 사용하는 방법을 보여 줍니다.
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 이벤트 전송을 사용하지 않도록 설정하지만 WebSockets 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 withUrl
에 제공된 옵션 개체에서 transport
필드를 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 HttpHubConnectionBuilder
의 withTransport
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
참고 항목
SignalR Java 클라이언트는 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
SignalR 요청과 함께 인증 데이터를 제공하려면 AccessTokenProvider
옵션(JavaScript의 경우 accessTokenFactory
)을 사용하여 원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP “전달자 인증” 토큰으로 전달됩니다(Bearer
형식에 Authorization
헤더 사용). 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 클라이언트에서 액세스 토큰은 withUrl
의 옵션 개체에서 accessTokenFactory
필드를 설정하여 구성됩니다.
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 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval 에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 TimeSpan
값으로 지정됩니다.
추가 옵션 구성
추가 옵션은 HubConnectionBuilder
의 WithUrl
(JavaScript의 경우 withUrl
) 메서드 또는 Java 클라이언트의 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 클라이언트에서 이러한 옵션은 HubConnectionBuilder.create("HUB URL")
에서 반환된 HttpHubConnectionBuilder
의 메서드를 사용하여 구성할 수 있습니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
추가 리소스
JSON/MessagePack serialization 옵션
ASP.NET Core SignalR은 메시지 인코딩을 위해 JSON 및 MessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
확장 메서드를 사용하여 서버에서 JSON serialization을 AddJsonProtocol 구성할 수 있습니다. AddJsonProtocol
을 Program.cs
에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol
메서드는 options
개체를 받는 대리자를 가져옵니다. PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다 System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어 기본 카멜 대/소문자 이름이 아닌 속성 이름의 대/소문자를 변경하지 않도록 serializer를 구성하려면 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으로 전환
System.Text.Json
에서 지원되지 않는 Newtonsoft.Json
의 기능이 필요한 경우 Newtonsoft.Json
으로 전환을 참조하세요.
MessagePack serialization 옵션
MessagePack serialization은 호출에 대리 AddMessagePackProtocol 자를 제공하여 구성할 수 있습니다. 자세한 내용은 SignalR의 MessagePack을 참조하세요.
참고 항목
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 SignalR 허브를 구성하기 위한 옵션을 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격으로 메시지(연결 유지 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되기까지 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 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 | 큐에 대기하기 전에 각 클라이언트가 병렬로 호출할 수 있는 허브 메서드의 최대 수입니다. |
Program.cs
에서 AddSignalR
호출에 옵션 대리자를 제공하여 모든 허브에 대해 옵션을 구성할 수 있습니다.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
단일 허브에 대한 옵션은 AddSignalR
에 제공된 전역 옵션을 재정의하며 AddHubOptions를 사용하여 구성할 수 있습니다.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
고급 HTTP 구성 옵션
HttpConnectionDispatcherOptions
를 사용하여 전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성합니다. 이러한 옵션은 Program.cs
에서 MapHub에 대리자를 전달하여 구성합니다.
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 |
false | 토큰이 만료될 때 연결을 닫는 인증 만료 추적을 사용하도록 설정하려면 이 옵션을 설정합니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 서버가 단일 폴링 요청을 종료하기 전에 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 폴링 요청을 더 자주 발급합니다. |
WebSocket 전송에는 WebSockets
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫힌 후 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
Sec-WebSocket-Protocol 헤더를 사용자 지정 값으로 설정하는 데 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고, 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 HubConnectionBuilder
형식(.NET 및 JavaScript 클라이언트에서 사용 가능)에 대해 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만 HttpHubConnectionBuilder
서브클래스는 HubConnection
자체에 있을 뿐만 아니라 작성기 구성 옵션을 포함하는 클래스입니다.
로깅 구성
로깅은 ConfigureLogging
메서드를 사용하여 .NET 클라이언트에서 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 경우와 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core 로깅 설명서를 참조하세요.
참고 항목
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 설명서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 Microsoft.Extensions.Logging.Console
NuGet 패키지를 설치합니다. 다음과 같이 AddConsole
확장 메서드를 호출합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
JavaScript 클라이언트에도 비슷한 configureLogging
메서드가 있습니다. 생성할 로그 메시지의 최소 수준을 나타내는 LogLevel
값을 제공합니다. 로그는 브라우저 콘솔 창에 기록됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
값 대신, 로그 수준 이름을 나타내는 string
값을 제공할 수도 있습니다. LogLevel
상수에 대한 액세스 권한이 없는 환경에서 SignalR 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 보여 줍니다. 사용자가 configureLogging
에 제공하는 값은 로깅할 최소 로그 수준을 설정합니다. 이 수준 또는 테이블에서 이 수준 다음에 나열되는 수준에서 로깅되는 메시지가 로깅됩니다.
문자열 | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info 또는 information |
LogLevel.Information |
warn 또는 warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
참고 항목
로깅을 완전히 비활성화하려면 configureLogging
메서드에 signalR.LogLevel.None
을 지정합니다.
로깅에 대한 자세한 내용은 SignalR 진단 설명서를 참조하세요.
SignalR Java 클라이언트는 로깅에 SLF4J 라이브러리를 사용합니다. 이것은 라이브러리 사용자가 특정 로깅 종속성을 가져와 자신의 특정 로깅 구현을 선택할 수 있게 해 주는 상위 수준 로깅 API입니다. 다음 코드 조각에서는 SignalR Java 클라이언트에서 java.util.logging
을 사용하는 방법을 보여 줍니다.
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 이벤트 전송을 사용하지 않도록 설정하지만 WebSockets 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 withUrl
에 제공된 옵션 개체에서 transport
필드를 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 HttpHubConnectionBuilder
의 withTransport
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
참고 항목
SignalR Java 클라이언트는 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
SignalR 요청과 함께 인증 데이터를 제공하려면 AccessTokenProvider
옵션(JavaScript의 경우 accessTokenFactory
)을 사용하여 원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP “전달자 인증” 토큰으로 전달됩니다(Bearer
형식에 Authorization
헤더 사용). 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 클라이언트에서 액세스 토큰은 withUrl
의 옵션 개체에서 accessTokenFactory
필드를 설정하여 구성됩니다.
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 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval 에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 TimeSpan
값으로 지정됩니다.
추가 옵션 구성
추가 옵션은 HubConnectionBuilder
의 WithUrl
(JavaScript의 경우 withUrl
) 메서드 또는 Java 클라이언트의 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 클라이언트에서 이러한 옵션은 HubConnectionBuilder.create("HUB URL")
에서 반환된 HttpHubConnectionBuilder
의 메서드를 사용하여 구성할 수 있습니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
추가 리소스
JSON/MessagePack serialization 옵션
ASP.NET Core SignalR은 메시지 인코딩을 위해 JSON 및 MessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.
확장 메서드를 사용하여 서버에서 JSON serialization을 AddJsonProtocol 구성할 수 있습니다. AddJsonProtocol
을 Startup.ConfigureServices
에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol
메서드는 options
개체를 받는 대리자를 가져옵니다. PayloadSerializerOptions 해당 개체의 속성은 인수의 serialization을 구성하고 값을 반환하는 데 사용할 수 있는 개체입니다 System.Text.Json
JsonSerializerOptions. 자세한 내용은 System.Text.Json 설명서를 참조하세요.
예를 들어 기본 카멜 대/소문자 이름이 아닌 속성 이름의 대/소문자를 변경하지 않도록 serializer를 구성하려면 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으로 전환
System.Text.Json
에서 지원되지 않는 Newtonsoft.Json
의 기능이 필요한 경우 Newtonsoft.Json
으로 전환을 참조하세요.
MessagePack serialization 옵션
MessagePack serialization은 호출에 대리 AddMessagePackProtocol 자를 제공하여 구성할 수 있습니다. 자세한 내용은 SignalR의 MessagePack을 참조하세요.
참고 항목
지금은 JavaScript 클라이언트에서 MessagePack serialization을 구성할 수 없습니다.
서버 옵션 구성
다음 표에서는 SignalR 허브를 구성하기 위한 옵션을 설명합니다.
옵션 | 기본값 | 설명 |
---|---|---|
ClientTimeoutInterval |
30초 | 서버는 이 간격으로 메시지(연결 유지 포함)를 받지 못한 경우 클라이언트의 연결이 끊어진 것으로 간주합니다. 클라이언트가 구현되는 방식 때문에 연결이 끊어진 것으로 표시되기까지 이 시간 제한 간격보다 더 오래 걸릴 수 있습니다. 권장 값은 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에서 확인됩니다. |
Program.cs
에서 AddSignalR
호출에 옵션 대리자를 제공하여 모든 허브에 대해 옵션을 구성할 수 있습니다.
builder.Services.AddSignalR(hubOptions =>
{
hubOptions.EnableDetailedErrors = true;
hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});
단일 허브에 대한 옵션은 AddSignalR
에 제공된 전역 옵션을 재정의하며 AddHubOptions를 사용하여 구성할 수 있습니다.
builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
options.EnableDetailedErrors = true;
});
고급 HTTP 구성 옵션
HttpConnectionDispatcherOptions
를 사용하여 전송 및 메모리 버퍼 관리와 관련된 고급 설정을 구성합니다. 이러한 옵션은 Program.cs
에서 MapHub에 대리자를 전달하여 구성합니다.
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 |
false | 토큰이 만료될 때 연결을 닫는 인증 만료 추적을 사용하도록 설정하려면 이 옵션을 설정합니다. |
긴 폴링 전송에는 LongPolling
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
PollTimeout |
90초 | 서버가 단일 폴링 요청을 종료하기 전에 클라이언트에 메시지를 보낼 때까지 대기하는 최대 시간입니다. 이 값을 줄이면 클라이언트가 새 폴링 요청을 더 자주 발급합니다. |
WebSocket 전송에는 WebSockets
속성을 사용하여 구성할 수 있는 추가 옵션이 있습니다.
옵션 | 기본값 | 설명 |
---|---|---|
CloseTimeout |
5초 | 서버가 닫힌 후 클라이언트가 이 시간 간격 내에 닫히지 못하면 연결이 종료됩니다. |
SubProtocolSelector |
null |
Sec-WebSocket-Protocol 헤더를 사용자 지정 값으로 설정하는 데 사용할 수 있는 대리자입니다. 대리자는 클라이언트에서 요청한 값을 입력으로 받고, 원하는 값을 반환해야 합니다. |
클라이언트 옵션 구성
클라이언트 옵션은 HubConnectionBuilder
형식(.NET 및 JavaScript 클라이언트에서 사용 가능)에 대해 구성할 수 있습니다. Java 클라이언트에서도 사용할 수 있지만 HttpHubConnectionBuilder
서브클래스는 HubConnection
자체에 있을 뿐만 아니라 작성기 구성 옵션을 포함하는 클래스입니다.
로깅 구성
로깅은 ConfigureLogging
메서드를 사용하여 .NET 클라이언트에서 구성됩니다. 로깅 공급자 및 필터는 서버에 있는 경우와 동일한 방식으로 등록할 수 있습니다. 자세한 내용은 ASP.NET Core 로깅 설명서를 참조하세요.
참고 항목
로깅 공급자를 등록하려면 필요한 패키지를 설치해야 합니다. 전체 목록은 설명서의 기본 제공 로깅 공급자 섹션을 참조하세요.
예를 들어 콘솔 로깅을 사용하도록 설정하려면 Microsoft.Extensions.Logging.Console
NuGet 패키지를 설치합니다. 다음과 같이 AddConsole
확장 메서드를 호출합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub")
.ConfigureLogging(logging => {
logging.SetMinimumLevel(LogLevel.Information);
logging.AddConsole();
})
.Build();
JavaScript 클라이언트에도 비슷한 configureLogging
메서드가 있습니다. 생성할 로그 메시지의 최소 수준을 나타내는 LogLevel
값을 제공합니다. 로그는 브라우저 콘솔 창에 기록됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging(signalR.LogLevel.Information)
.build();
LogLevel
값 대신, 로그 수준 이름을 나타내는 string
값을 제공할 수도 있습니다. LogLevel
상수에 대한 액세스 권한이 없는 환경에서 SignalR 로깅을 구성할 때 유용합니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub")
.configureLogging("warn")
.build();
다음 표에서는 사용 가능한 로그 수준을 보여 줍니다. 사용자가 configureLogging
에 제공하는 값은 로깅할 최소 로그 수준을 설정합니다. 이 수준 또는 테이블에서 이 수준 다음에 나열되는 수준에서 로깅되는 메시지가 로깅됩니다.
문자열 | LogLevel |
---|---|
trace |
LogLevel.Trace |
debug |
LogLevel.Debug |
info 또는 information |
LogLevel.Information |
warn 또는 warning |
LogLevel.Warning |
error |
LogLevel.Error |
critical |
LogLevel.Critical |
none |
LogLevel.None |
참고 항목
로깅을 완전히 비활성화하려면 configureLogging
메서드에 signalR.LogLevel.None
을 지정합니다.
로깅에 대한 자세한 내용은 SignalR 진단 설명서를 참조하세요.
SignalR Java 클라이언트는 로깅에 SLF4J 라이브러리를 사용합니다. 이것은 라이브러리 사용자가 특정 로깅 종속성을 가져와 자신의 특정 로깅 구현을 선택할 수 있게 해 주는 상위 수준 로깅 API입니다. 다음 코드 조각에서는 SignalR Java 클라이언트에서 java.util.logging
을 사용하는 방법을 보여 줍니다.
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 이벤트 전송을 사용하지 않도록 설정하지만 WebSockets 및 긴 폴링 연결을 허용하려면 다음을 수행합니다.
var connection = new HubConnectionBuilder()
.WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
.Build();
JavaScript 클라이언트에서 전송은 withUrl
에 제공된 옵션 개체에서 transport
필드를 설정하여 구성됩니다.
let connection = new signalR.HubConnectionBuilder()
.withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
.build();
이 버전의 Java 클라이언트 WebSockets는 사용 가능한 유일한 전송입니다.
Java 클라이언트에서 HttpHubConnectionBuilder
의 withTransport
메서드를 사용하여 전송이 선택됩니다. Java 클라이언트는 기본적으로 WebSockets 전송을 사용합니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withTransport(TransportEnum.WEBSOCKETS)
.build();
참고 항목
SignalR Java 클라이언트는 아직 전송 대체를 지원하지 않습니다.
전달자 인증 구성
SignalR 요청과 함께 인증 데이터를 제공하려면 AccessTokenProvider
옵션(JavaScript의 경우 accessTokenFactory
)을 사용하여 원하는 액세스 토큰을 반환하는 함수를 지정합니다. .NET 클라이언트에서 이 액세스 토큰은 HTTP “전달자 인증” 토큰으로 전달됩니다(Bearer
형식에 Authorization
헤더 사용). 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 클라이언트에서 액세스 토큰은 withUrl
의 옵션 개체에서 accessTokenFactory
필드를 설정하여 구성됩니다.
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 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다. |
HandshakeTimeout |
15초 | 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose )를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요. |
KeepAliveInterval |
15초 | 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval 에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다. |
.NET 클라이언트에서 시간 제한 값은 TimeSpan
값으로 지정됩니다.
추가 옵션 구성
추가 옵션은 HubConnectionBuilder
의 WithUrl
(JavaScript의 경우 withUrl
) 메서드 또는 Java 클라이언트의 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 클라이언트에서 이러한 옵션은 HubConnectionBuilder.create("HUB URL")
에서 반환된 HttpHubConnectionBuilder
의 메서드를 사용하여 구성할 수 있습니다.
HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
.withHeader("Foo", "Bar")
.shouldSkipNegotiate(true)
.withHandshakeResponseTimeout(30*1000)
.build();
추가 리소스
ASP.NET Core