ASP.NET Core SignalR 구성

JSON/MessagePack serialization 옵션

ASP.NET Core SignalR은 메시지 인코딩을 위해 JSONMessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.

JSON serialization은 AddJsonProtocol 확장 메서드를 사용하여 서버에서 구성할 수 있습니다. AddJsonProtocolStartup.ConfigureServices에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol 메서드는 options 개체를 받는 대리자를 가져옵니다. 해당 개체의 PayloadSerializerOptions 속성은 인수와 반환 값의 serialization을 구성하는 데 사용할 수 있는 System.Text.JsonJsonSerializerOptions 개체입니다. 자세한 내용은 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
infoorinformation LogLevel.Information
warnorwarning 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 클라이언트에서 HttpHubConnectionBuilderwithTransport 메서드를 사용하여 전송이 선택됩니다. 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를 사용하여 RxJavaSingle<String>을 제공합니다. Single.defer를 호출하면 클라이언트에 대한 액세스 토큰을 생성하는 논리를 작성할 수 있습니다.

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

시간 제한 및 연결 유지 옵션 구성

시간 제한 및 연결 유지 동작을 구성하기 위한 추가 옵션:

옵션 기본값 설명
WithServerTimeout 30초(30,000밀리초) 서버 작업에 대한 시간 제한이며 .HubConnectionBuilder 서버가 이 간격으로 메시지를 보내지 않은 경우 클라이언트는 서버 연결이 끊어진 것으로 간주하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping이 도착하는 시간을 허용하는 서버의 연결 유지 간격(WithKeepAliveInterval) 값의 두 배 이상의 숫자입니다.
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바이트인 선택 사항입니다.

추가 옵션 구성

추가 옵션은 HubConnectionBuilderWithUrl(JavaScript의 경우 withUrl) 메서드 또는 Java 클라이언트의 HttpHubConnectionBuilder에 있는 다양한 구성 API에서 구성할 수 있습니다.

.NET 옵션 기본값 설명
AccessTokenProvider null HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다.
SkipNegotiation false 협상 단계를 건너뛰려면 이 설정을 true로 설정합니다. WebSockets 전송만 유일하게 사용하도록 설정된 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용하도록 설정할 수 없습니다.
ClientCertificates 비어 있음 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다.
Cookies 비어 있음 모든 HTTP 요청과 함께 보낼 HTTP cookie의 컬렉션입니다.
Credentials 비어 있음 모든 HTTP 요청과 함께 보낼 자격 증명입니다.
CloseTimeout 5초 WebSockets만 해당합니다. 닫은 후에 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다.
Headers 비어 있음 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다.
HttpMessageHandlerFactory null HTTP 요청을 보내는 데 사용되는 HttpMessageHandler를 구성하거나 바꾸는 데 사용할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다. 처리기를 바꿀 경우 유지하려는 설정을 제공된 처리기에서 복사해야 합니다. 그러지 않으면 구성된 옵션(예: Cookie 및 헤더)이 새 처리기에 적용되지 않습니다.
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은 메시지 인코딩을 위해 JSONMessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.

AddJsonProtocol 확장 메서드를 사용하여 서버에서 JSON serialization을 구성할 수 있습니다. 이 메서드는 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를 사용하여 RxJavaSingle<String>을 제공합니다. Single.defer를 호출하면 클라이언트에 대한 액세스 토큰을 생성하는 논리를 작성할 수 있습니다.

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

시간 제한 및 연결 유지 옵션 구성

시간 제한 및 연결 유지 동작을 구성하기 위한 추가 옵션은 HubConnection 개체 자체에 대해 사용할 수 있습니다.

옵션 기본값 설명
ServerTimeout 30초(30,000밀리초) 서버 작업에 대한 시간 제한입니다. 서버가 이 간격으로 메시지를 보내지 않은 경우 클라이언트는 서버 연결이 끊어진 것으로 간주하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다.
HandshakeTimeout 15초 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요.

.NET 클라이언트에서 시간 제한 값은 TimeSpan 값으로 지정됩니다.

추가 옵션 구성

추가 옵션은 HubConnectionBuilderWithUrl(JavaScript의 경우 withUrl) 메서드 또는 Java 클라이언트의 HttpHubConnectionBuilder에 있는 다양한 구성 API에서 구성할 수 있습니다.

.NET 옵션 기본값 설명
AccessTokenProvider null HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다.
SkipNegotiation false 협상 단계를 건너뛰려면 이 설정을 true로 설정합니다. WebSockets 전송만 유일하게 사용하도록 설정된 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용하도록 설정할 수 없습니다.
ClientCertificates 비어 있음 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다.
Cookies 비어 있음 모든 HTTP 요청과 함께 보낼 HTTP cookie의 컬렉션입니다.
Credentials 비어 있음 모든 HTTP 요청과 함께 보낼 자격 증명입니다.
CloseTimeout 5초 WebSockets만 해당합니다. 닫은 후에 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다.
Headers 비어 있음 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다.
HttpMessageHandlerFactory null HTTP 요청을 보내는 데 사용되는 HttpMessageHandler를 구성하거나 바꾸는 데 사용할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다. 처리기를 바꿀 경우 유지하려는 설정을 제공된 처리기에서 복사해야 합니다. 그러지 않으면 구성된 옵션(예: Cookie 및 헤더)이 새 처리기에 적용되지 않습니다.
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은 메시지 인코딩을 위해 JSONMessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.

AddJsonProtocol 확장 메서드를 사용하여 서버에서 JSON serialization을 구성할 수 있습니다. 이 메서드는 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를 사용하여 RxJavaSingle<String>을 제공합니다. Single.defer를 호출하면 클라이언트에 대한 액세스 토큰을 생성하는 논리를 작성할 수 있습니다.

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

시간 제한 및 연결 유지 옵션 구성

시간 제한 및 연결 유지 동작을 구성하기 위한 추가 옵션은 HubConnection 개체 자체에 대해 사용할 수 있습니다.

옵션 기본값 설명
ServerTimeout 30초(30,000밀리초) 서버 작업에 대한 시간 제한입니다. 서버가 이 간격으로 메시지를 보내지 않은 경우 클라이언트는 서버 연결이 끊어진 것으로 간주하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다.
HandshakeTimeout 15초 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요.
KeepAliveInterval 15초 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다.

.NET 클라이언트에서 시간 제한 값은 TimeSpan 값으로 지정됩니다.

추가 옵션 구성

추가 옵션은 HubConnectionBuilderWithUrl(JavaScript의 경우 withUrl) 메서드 또는 Java 클라이언트의 HttpHubConnectionBuilder에 있는 다양한 구성 API에서 구성할 수 있습니다.

.NET 옵션 기본값 설명
AccessTokenProvider null HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다.
SkipNegotiation false 협상 단계를 건너뛰려면 이 설정을 true로 설정합니다. WebSockets 전송만 유일하게 사용하도록 설정된 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용하도록 설정할 수 없습니다.
ClientCertificates 비어 있음 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다.
Cookies 비어 있음 모든 HTTP 요청과 함께 보낼 HTTP cookie의 컬렉션입니다.
Credentials 비어 있음 모든 HTTP 요청과 함께 보낼 자격 증명입니다.
CloseTimeout 5초 WebSockets만 해당합니다. 닫은 후에 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다.
Headers 비어 있음 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다.
HttpMessageHandlerFactory null HTTP 요청을 보내는 데 사용되는 HttpMessageHandler를 구성하거나 바꾸는 데 사용할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다. 처리기를 바꿀 경우 유지하려는 설정을 제공된 처리기에서 복사해야 합니다. 그러지 않으면 구성된 옵션(예: Cookie 및 헤더)이 새 처리기에 적용되지 않습니다.
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은 메시지 인코딩을 위해 JSONMessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.

JSON serialization은 AddJsonProtocol 확장 메서드를 사용하여 서버에서 구성할 수 있습니다. AddJsonProtocolStartup.ConfigureServices에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol 메서드는 options 개체를 받는 대리자를 가져옵니다. 해당 개체의 PayloadSerializerOptions 속성은 인수와 반환 값의 serialization을 구성하는 데 사용할 수 있는 System.Text.JsonJsonSerializerOptions 개체입니다. 자세한 내용은 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
infoorinformation LogLevel.Information
warnorwarning 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 클라이언트에서 HttpHubConnectionBuilderwithTransport 메서드를 사용하여 전송이 선택됩니다. 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를 사용하여 RxJavaSingle<String>을 제공합니다. Single.defer를 호출하면 클라이언트에 대한 액세스 토큰을 생성하는 논리를 작성할 수 있습니다.

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

시간 제한 및 연결 유지 옵션 구성

시간 제한 및 연결 유지 동작을 구성하기 위한 추가 옵션은 HubConnection 개체 자체에 대해 사용할 수 있습니다.

옵션 기본값 설명
ServerTimeout 30초(30,000밀리초) 서버 작업에 대한 시간 제한입니다. 서버가 이 간격으로 메시지를 보내지 않은 경우 클라이언트는 서버 연결이 끊어진 것으로 간주하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다.
HandshakeTimeout 15초 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요.
KeepAliveInterval 15초 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다.

.NET 클라이언트에서 시간 제한 값은 TimeSpan 값으로 지정됩니다.

추가 옵션 구성

추가 옵션은 HubConnectionBuilderWithUrl(JavaScript의 경우 withUrl) 메서드 또는 Java 클라이언트의 HttpHubConnectionBuilder에 있는 다양한 구성 API에서 구성할 수 있습니다.

.NET 옵션 기본값 설명
AccessTokenProvider null HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다.
SkipNegotiation false 협상 단계를 건너뛰려면 이 설정을 true로 설정합니다. WebSockets 전송만 유일하게 사용하도록 설정된 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용하도록 설정할 수 없습니다.
ClientCertificates 비어 있음 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다.
Cookies 비어 있음 모든 HTTP 요청과 함께 보낼 HTTP cookie의 컬렉션입니다.
Credentials 비어 있음 모든 HTTP 요청과 함께 보낼 자격 증명입니다.
CloseTimeout 5초 WebSockets만 해당합니다. 닫은 후에 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다.
Headers 비어 있음 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다.
HttpMessageHandlerFactory null HTTP 요청을 보내는 데 사용되는 HttpMessageHandler를 구성하거나 바꾸는 데 사용할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다. 처리기를 바꿀 경우 유지하려는 설정을 제공된 처리기에서 복사해야 합니다. 그러지 않으면 구성된 옵션(예: Cookie 및 헤더)이 새 처리기에 적용되지 않습니다.
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은 메시지 인코딩을 위해 JSONMessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.

JSON serialization은 AddJsonProtocol 확장 메서드를 사용하여 서버에서 구성할 수 있습니다. AddJsonProtocolStartup.ConfigureServices에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol 메서드는 options 개체를 받는 대리자를 가져옵니다. 해당 개체의 PayloadSerializerOptions 속성은 인수와 반환 값의 serialization을 구성하는 데 사용할 수 있는 System.Text.JsonJsonSerializerOptions 개체입니다. 자세한 내용은 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
infoorinformation LogLevel.Information
warnorwarning 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 클라이언트에서 HttpHubConnectionBuilderwithTransport 메서드를 사용하여 전송이 선택됩니다. 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를 사용하여 RxJavaSingle<String>을 제공합니다. Single.defer를 호출하면 클라이언트에 대한 액세스 토큰을 생성하는 논리를 작성할 수 있습니다.

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

시간 제한 및 연결 유지 옵션 구성

시간 제한 및 연결 유지 동작을 구성하기 위한 추가 옵션은 HubConnection 개체 자체에 대해 사용할 수 있습니다.

옵션 기본값 설명
ServerTimeout 30초(30,000밀리초) 서버 작업에 대한 시간 제한입니다. 서버가 이 간격으로 메시지를 보내지 않은 경우 클라이언트는 서버 연결이 끊어진 것으로 간주하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다.
HandshakeTimeout 15초 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요.
KeepAliveInterval 15초 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다.

.NET 클라이언트에서 시간 제한 값은 TimeSpan 값으로 지정됩니다.

추가 옵션 구성

추가 옵션은 HubConnectionBuilderWithUrl(JavaScript의 경우 withUrl) 메서드 또는 Java 클라이언트의 HttpHubConnectionBuilder에 있는 다양한 구성 API에서 구성할 수 있습니다.

.NET 옵션 기본값 설명
AccessTokenProvider null HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다.
SkipNegotiation false 협상 단계를 건너뛰려면 이 설정을 true로 설정합니다. WebSockets 전송만 유일하게 사용하도록 설정된 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용하도록 설정할 수 없습니다.
ClientCertificates 비어 있음 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다.
Cookies 비어 있음 모든 HTTP 요청과 함께 보낼 HTTP cookie의 컬렉션입니다.
Credentials 비어 있음 모든 HTTP 요청과 함께 보낼 자격 증명입니다.
CloseTimeout 5초 WebSockets만 해당합니다. 닫은 후에 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다.
Headers 비어 있음 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다.
HttpMessageHandlerFactory null HTTP 요청을 보내는 데 사용되는 HttpMessageHandler를 구성하거나 바꾸는 데 사용할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다. 처리기를 바꿀 경우 유지하려는 설정을 제공된 처리기에서 복사해야 합니다. 그러지 않으면 구성된 옵션(예: Cookie 및 헤더)이 새 처리기에 적용되지 않습니다.
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은 메시지 인코딩을 위해 JSONMessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.

JSON serialization은 AddJsonProtocol 확장 메서드를 사용하여 서버에서 구성할 수 있습니다. AddJsonProtocolStartup.ConfigureServices에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol 메서드는 options 개체를 받는 대리자를 가져옵니다. 해당 개체의 PayloadSerializerOptions 속성은 인수와 반환 값의 serialization을 구성하는 데 사용할 수 있는 System.Text.JsonJsonSerializerOptions 개체입니다. 자세한 내용은 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
infoorinformation LogLevel.Information
warnorwarning 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 클라이언트에서 HttpHubConnectionBuilderwithTransport 메서드를 사용하여 전송이 선택됩니다. 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를 사용하여 RxJavaSingle<String>을 제공합니다. Single.defer를 호출하면 클라이언트에 대한 액세스 토큰을 생성하는 논리를 작성할 수 있습니다.

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

시간 제한 및 연결 유지 옵션 구성

시간 제한 및 연결 유지 동작을 구성하기 위한 추가 옵션은 HubConnection 개체 자체에 대해 사용할 수 있습니다.

옵션 기본값 설명
ServerTimeout 30초(30,000밀리초) 서버 작업에 대한 시간 제한입니다. 서버가 이 간격으로 메시지를 보내지 않은 경우 클라이언트는 서버 연결이 끊어진 것으로 간주하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다.
HandshakeTimeout 15초 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요.
KeepAliveInterval 15초 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다.

.NET 클라이언트에서 시간 제한 값은 TimeSpan 값으로 지정됩니다.

추가 옵션 구성

추가 옵션은 HubConnectionBuilderWithUrl(JavaScript의 경우 withUrl) 메서드 또는 Java 클라이언트의 HttpHubConnectionBuilder에 있는 다양한 구성 API에서 구성할 수 있습니다.

.NET 옵션 기본값 설명
AccessTokenProvider null HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다.
SkipNegotiation false 협상 단계를 건너뛰려면 이 설정을 true로 설정합니다. WebSockets 전송만 유일하게 사용하도록 설정된 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용하도록 설정할 수 없습니다.
ClientCertificates 비어 있음 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다.
Cookies 비어 있음 모든 HTTP 요청과 함께 보낼 HTTP cookie의 컬렉션입니다.
Credentials 비어 있음 모든 HTTP 요청과 함께 보낼 자격 증명입니다.
CloseTimeout 5초 WebSockets만 해당합니다. 닫은 후에 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다.
Headers 비어 있음 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다.
HttpMessageHandlerFactory null HTTP 요청을 보내는 데 사용되는 HttpMessageHandler를 구성하거나 바꾸는 데 사용할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다. 처리기를 바꿀 경우 유지하려는 설정을 제공된 처리기에서 복사해야 합니다. 그러지 않으면 구성된 옵션(예: Cookie 및 헤더)이 새 처리기에 적용되지 않습니다.
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은 메시지 인코딩을 위해 JSONMessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.

JSON serialization은 AddJsonProtocol 확장 메서드를 사용하여 서버에서 구성할 수 있습니다. AddJsonProtocolProgram.cs에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol 메서드는 options 개체를 받는 대리자를 가져옵니다. 해당 개체의 PayloadSerializerOptions 속성은 인수와 반환 값의 serialization을 구성하는 데 사용할 수 있는 System.Text.JsonJsonSerializerOptions 개체입니다. 자세한 내용은 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
infoorinformation LogLevel.Information
warnorwarning 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 클라이언트에서 HttpHubConnectionBuilderwithTransport 메서드를 사용하여 전송이 선택됩니다. 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를 사용하여 RxJavaSingle<String>을 제공합니다. Single.defer를 호출하면 클라이언트에 대한 액세스 토큰을 생성하는 논리를 작성할 수 있습니다.

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

시간 제한 및 연결 유지 옵션 구성

시간 제한 및 연결 유지 동작을 구성하기 위한 추가 옵션은 HubConnection 개체 자체에 대해 사용할 수 있습니다.

옵션 기본값 설명
ServerTimeout 30초(30,000밀리초) 서버 작업에 대한 시간 제한입니다. 서버가 이 간격으로 메시지를 보내지 않은 경우 클라이언트는 서버 연결이 끊어진 것으로 간주하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다.
HandshakeTimeout 15초 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요.
KeepAliveInterval 15초 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다.

.NET 클라이언트에서 시간 제한 값은 TimeSpan 값으로 지정됩니다.

추가 옵션 구성

추가 옵션은 HubConnectionBuilderWithUrl(JavaScript의 경우 withUrl) 메서드 또는 Java 클라이언트의 HttpHubConnectionBuilder에 있는 다양한 구성 API에서 구성할 수 있습니다.

.NET 옵션 기본값 설명
AccessTokenProvider null HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다.
SkipNegotiation false 협상 단계를 건너뛰려면 이 설정을 true로 설정합니다. WebSockets 전송만 유일하게 사용하도록 설정된 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용하도록 설정할 수 없습니다.
ClientCertificates 비어 있음 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다.
Cookies 비어 있음 모든 HTTP 요청과 함께 보낼 HTTP cookie의 컬렉션입니다.
Credentials 비어 있음 모든 HTTP 요청과 함께 보낼 자격 증명입니다.
CloseTimeout 5초 WebSockets만 해당합니다. 닫은 후에 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다.
Headers 비어 있음 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다.
HttpMessageHandlerFactory null HTTP 요청을 보내는 데 사용되는 HttpMessageHandler를 구성하거나 바꾸는 데 사용할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다. 처리기를 바꿀 경우 유지하려는 설정을 제공된 처리기에서 복사해야 합니다. 그러지 않으면 구성된 옵션(예: Cookie 및 헤더)이 새 처리기에 적용되지 않습니다.
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은 메시지 인코딩을 위해 JSONMessagePack의 두 가지 프로토콜을 지원합니다. 각 프로토콜에는 serialization 구성 옵션이 있습니다.

JSON serialization은 AddJsonProtocol 확장 메서드를 사용하여 서버에서 구성할 수 있습니다. AddJsonProtocolStartup.ConfigureServices에서 AddSignalR 다음에 추가할 수 있습니다. AddJsonProtocol 메서드는 options 개체를 받는 대리자를 가져옵니다. 해당 개체의 PayloadSerializerOptions 속성은 인수와 반환 값의 serialization을 구성하는 데 사용할 수 있는 System.Text.JsonJsonSerializerOptions 개체입니다. 자세한 내용은 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
infoorinformation LogLevel.Information
warnorwarning 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 클라이언트에서 HttpHubConnectionBuilderwithTransport 메서드를 사용하여 전송이 선택됩니다. 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를 사용하여 RxJavaSingle<String>을 제공합니다. Single.defer를 호출하면 클라이언트에 대한 액세스 토큰을 생성하는 논리를 작성할 수 있습니다.

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

시간 제한 및 연결 유지 옵션 구성

시간 제한 및 연결 유지 동작을 구성하기 위한 추가 옵션은 HubConnection 개체 자체에 대해 사용할 수 있습니다.

옵션 기본값 설명
ServerTimeout 30초(30,000밀리초) 서버 작업에 대한 시간 제한입니다. 서버가 이 간격으로 메시지를 보내지 않은 경우 클라이언트는 서버 연결이 끊어진 것으로 간주하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 값은 시간 제한 간격 내에 서버에서 ping 메시지를 보내고 클라이언트가 받을 수 있을 만큼 커야 합니다. 권장 값은 ping 도착 시간을 허용하기 위해 서버 KeepAliveInterval 값의 두 배 이상인 숫자입니다.
HandshakeTimeout 15초 초기 서버 핸드셰이크에 대한 시간 제한입니다. 서버가 이 간격으로 핸드셰이크 응답을 보내지 않으면 클라이언트는 핸드셰이크를 취소하고 Closed 이벤트(JavaScript의 경우 onclose)를 트리거합니다. 이 설정은 심각한 네트워크 대기 시간으로 인해 핸드셰이크 시간 제한 오류가 발생하는 경우에만 수정해야 하는 고급 설정입니다. 핸드셰이크 프로세스에 대한 자세한 내용은 SignalR허브 프로토콜 사양을 참조하세요.
KeepAliveInterval 15초 클라이언트에서 ping 메시지를 보내는 간격을 결정합니다. 클라이언트에서 메시지를 보내면 타이머를 시간 간격의 시작으로 다시 설정합니다. 클라이언트가 서버에 설정된 ClientTimeoutInterval에 따라 메시지를 보내지 않은 경우 서버는 클라이언트 연결이 끊어진 것으로 간주합니다.

.NET 클라이언트에서 시간 제한 값은 TimeSpan 값으로 지정됩니다.

추가 옵션 구성

추가 옵션은 HubConnectionBuilderWithUrl(JavaScript의 경우 withUrl) 메서드 또는 Java 클라이언트의 HttpHubConnectionBuilder에 있는 다양한 구성 API에서 구성할 수 있습니다.

.NET 옵션 기본값 설명
AccessTokenProvider null HTTP 요청에서 전달자 인증 토큰으로 제공되는 문자열을 반환하는 함수입니다.
SkipNegotiation false 협상 단계를 건너뛰려면 이 설정을 true로 설정합니다. WebSockets 전송만 유일하게 사용하도록 설정된 경우에만 지원됩니다. Azure SignalR 서비스를 사용할 때는 이 설정을 사용하도록 설정할 수 없습니다.
ClientCertificates 비어 있음 요청을 인증하기 위해 보낼 TLS 인증서의 컬렉션입니다.
Cookies 비어 있음 모든 HTTP 요청과 함께 보낼 HTTP cookie의 컬렉션입니다.
Credentials 비어 있음 모든 HTTP 요청과 함께 보낼 자격 증명입니다.
CloseTimeout 5초 WebSockets만 해당합니다. 닫은 후에 서버가 닫기 요청을 승인할 때까지 클라이언트가 대기하는 최대 시간입니다. 서버가 이 시간 내에 닫기를 승인하지 않으면 클라이언트의 연결이 끊어집니다.
Headers 비어 있음 모든 HTTP 요청과 함께 보낼 추가 HTTP 헤더의 맵입니다.
HttpMessageHandlerFactory null HTTP 요청을 보내는 데 사용되는 HttpMessageHandler를 구성하거나 바꾸는 데 사용할 수 있는 대리자입니다. WebSocket 연결에는 사용되지 않습니다. 이 대리자는 null이 아닌 값을 반환해야 하며 기본값을 매개 변수로 받습니다. 해당 기본값에 대한 설정을 수정하고 반환하거나 새 HttpMessageHandler 인스턴스를 반환합니다. 처리기를 바꿀 경우 유지하려는 설정을 제공된 처리기에서 복사해야 합니다. 그러지 않으면 구성된 옵션(예: Cookie 및 헤더)이 새 처리기에 적용되지 않습니다.
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();

추가 리소스