ASP.NET 核心 SignalR 配置

本文介绍 ASP.NET 核心 SignalR 配置。

有关添加或取代本文中指导的 BlazorSignalR 指导,请参阅 ASP.NET Core BlazorSignalR 指导

JSON/MessagePack 序列化选项

ASP.NET Core SignalR 支持两种编码消息的协议: JSONMessagePack。 各个协议都有可用于序列化的配置选项。

可以在服务器上使用 AddJsonProtocol 扩展方法来配置 JSON 序列化。 可将 AddJsonProtocol 添加到 AddSignalR 中的 Startup.ConfigureServices 之后。 AddJsonProtocol 方法采用接收 options 对象的委托。 该 PayloadSerializerOptions 对象的属性是一个 System.Text.JsonJsonSerializerOptions 对象,可用于配置参数和返回值的序列化。 有关详细信息,请参阅 System.Text.Json 文档

例如,要将序列化程序配置为不更改属性名称的大小写,但又不使用默认的大小写名称,请在 Program.cs 中使用以下代码:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

在 .NET 客户端中,AddJsonProtocol 上有相同的 HubConnectionBuilder 扩展方法。 必须导入Microsoft.Extensions.DependencyInjection命名空间以解析扩展方法。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

注释

目前无法在 JavaScript 客户端中配置 JSON 序列化。

切换到 Newtonsoft.Json

如果需要 Newtonsoft.Json 中不支持的 System.Text.Json 功能,请参阅切换到 Newtonsoft.Json

MessagePack 序列化选项

可以通过向 AddMessagePackProtocol 调用提供委托来配置 MessagePack 序列化。 有关更多详细信息,请参阅 SignalR 中的 MessagePack

注释

目前无法在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 中心的选项:

选项 默认值 DESCRIPTION
ClientTimeoutInterval 30 秒 如果客户端未在此时间间隔内收到消息(包括保持活动状态),则服务器会将其视为已断开连接。 由于实现方式的不同,将客户端标记为断开连接可能需要更长的超时间隔时间。 建议的值是两倍 KeepAliveInterval 的值。
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,则会关闭连接。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 如果服务器在此时间间隔内未发送消息,则会自动发送 ping 消息以保持连接打开状态。 更改 KeepAliveInterval时,更改客户端上的 ServerTimeout 设置或 serverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 如果在 trueHub 方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。
StreamBufferCapacity 10 可以为客户端上传流缓冲的最大项数。 如果达到此限制,将阻止调用的处理,直到服务器处理流项。
MaximumReceiveMessageSize 32 KB 单个传入中心消息的最大大小。 增加此值可能会增加 拒绝服务(DoS)攻击的风险。
MaximumParallelInvocationsPerClient 1 在排队之前,每个客户端可以并行调用的中心方法的最大数量。
DisableImplicitFromServicesParameters false 如果可能,将从 DI 解析中心方法参数。

可以通过在 AddSignalR 中向 Program.cs 调用提供选项委托,为所有中心配置选项。

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

单个集线器的选项将覆盖AddSignalR提供的全局选项,并且可以使用AddHubOptions进行配置。

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高级 HTTP 配置选项

用于 HttpConnectionDispatcherOptions 配置与传输和内存缓冲区管理相关的高级设置。 通过将委托传递给 MapHub 中的 Program.cs 来配置这些选项。

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

下表介绍了用于配置 ASP.NET Core SignalR的高级 HTTP 选项的选项:

选项 默认值 DESCRIPTION
ApplicationMaxBufferSize 64 KB 在应用反压之前,服务器所缓冲的从客户端接收到的字节的最大数目。 增加此值可使服务器更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
TransportMaxBufferSize 64 KB 服务器在观察到反压之前所缓冲的由应用发送的字节的最大数目。 增加此值可使服务器更快地缓冲较大的消息,而无需等待反压,但会增加内存消耗。
AuthorizationData 从应用于 Hub 类的 Authorize 属性中自动收集的数据。 用于确定客户端是否有权连接到中心的对象列表 IAuthorizeData
Transports 所有传输都已启用。 位标志 HttpTransportType 值的枚举,这些值可限制客户端用于连接的传输。
LongPolling 请参阅下文。 特定于长轮询传输的其他选项。
WebSockets 请参阅下文。 特定于 WebSocket 传输的其他选项。
MinimumProtocolVersion 0 指定协商协议的最低版本。 这用于将客户端限制为较新版本。
CloseOnAuthenticationExpiration 设置此选项以启用身份验证过期跟踪,这会在令牌过期时关闭连接。

长轮询传输提供可使用 LongPolling 属性配置的其他选项:

选项 默认值 DESCRIPTION
PollTimeout 90 秒 服务器在终止单个轮询请求之前等待消息发送到客户端的最大时间。 降低此值会导致客户端更频繁地发出新的轮询请求。

WebSocket 传输具有可以使用属性 WebSockets 配置的其他选项:

选项 默认值 DESCRIPTION
CloseTimeout 5 秒 服务器关闭后,如果客户端在此时间间隔内未能关闭,连接将终止。
SubProtocolSelector null 一个委托,可用于将 Sec-WebSocket-Protocol 标头设置为自定义值。 委托接收客户端请求的值作为输入,并预期返回所需的值。

配置客户端选项

客户端选项可以在HubConnectionBuilder类型上配置(适用于 .NET 和 JavaScript 客户端)。 它在 Java 客户端中也可用,但 HttpHubConnectionBuilder 子类包含生成器配置选项以及 HubConnection 本身。

配置日志记录

.NET 客户端中的日志记录是使用 ConfigureLogging 方法配置的。 提供程序和筛选器的注册方式与它们在服务器上的注册方式相同。 有关详细信息,请参阅 ASP.NET Core 文档中的日志记录。

注释

若要注册日志记录提供程序,必须安装必要的包。 有关完整列表,请参阅文档的 内置日志记录提供程序 部分。

例如,若要启用控制台日志记录,请安装 Microsoft.Extensions.Logging.Console NuGet 包。 AddConsole调用扩展方法:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

在 JavaScript 客户端中,存在类似的 configureLogging 方法。 提供一个 LogLevel 值,该值指示要生成的日志消息的最小级别。 日志将写入浏览器控制台窗口。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

还可以提供表示日志级别名称的 LogLevel 值,而不是 string 值。 在无权访问SignalR常量的环境中配置LogLevel日志记录时,这非常有用。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

下表列出了可用的日志级别。 提供给configureLogging 的值将设置记录的最低日志级别。 将记录此级别的或表中该级别后面列出的级别的消息。

字符串 LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoinformation LogLevel.Information
warnwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

注释

若要完全禁用日志记录,请在signalR.LogLevel.None方法中指定configureLogging

有关日志记录的详细信息,请参阅 SignalR 诊断文档

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志记录 API,它允许用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段演示如何与 Java 客户端一起使用java.util.loggingSignalR。

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 来限制客户端仅使用指定的传输。 默认情况下,所有传输都处于启用状态。

例如,要禁用“服务器发送的事件”传输,但允许 WebSocket 和长轮询连接,请执行以下操作:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

在 JavaScript 客户端中,通过在传递给 transport 的选项对象上设置 withUrl 字段来配置传输方式。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

在此版本的 Java 客户端中,WebSocket 是唯一可用的传输方式。

在 Java 客户端中,通过withTransport方法在HttpHubConnectionBuilder上选择传输。 Java 客户端默认使用 WebSocket 传输。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

注释

SignalR Java 客户端尚不支持传输回退。

配置持有者身份验证

若要提供身份验证数据以及 SignalR 请求,请使用 AccessTokenProvider 选项(accessTokenFactory 在 JavaScript 中)指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP“持有者身份验证”令牌传入(将 Authorization 标头与类型 Bearer一起使用)。 在 JavaScript 客户端中,访问令牌充当持有者令牌,除了少数浏览器 API 会限制标头应用能力的情况(特别是在“服务器发送的事件”和 WebSocket 请求中)。 在这些情况下,访问令牌以查询字符串值 access_token的形式提供。

在 .NET 客户端中,可以使用 AccessTokenProvider 中的选项委托来指定 WithUrl 选项。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

在 JavaScript 客户端中,通过在以下选项对象accessTokenFactory上设置withUrl字段来配置访问令牌:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

在 Java 客户端中 SignalR ,可以通过向 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();

配置超时和“保持活动状态”选项

用于配置超时和保持连接行为的其他选项:

选项 默认值 DESCRIPTION
WithServerTimeout 30 秒(30,000 毫秒) 服务器活动的超时,可直接在 HubConnectionBuilder 上进行设置。 如果服务器在此间隔内未发送消息,客户端会考虑服务器已断开连接并触发 Closed 事件(onclose 在 JavaScript 中)。 此值必须足够大,才能从服务器发送 ping 消息 ,并在 超时间隔内由客户端接收。 要让 ping 能够到达,建议的值至少应是服务器的保持连接间隔 (WithKeepAliveInterval) 值的两倍。
HandshakeTimeout 15 秒 初始服务器握手的超时,在 HubConnection 对象本身上可用。 如果服务器在此间隔内未发送握手响应,客户端将取消握手并触发 Closed 事件(onclose 在 JavaScript 中)。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
WithKeepAliveInterval 15 秒 确定客户端发送 ping 消息的时间间隔,并直接在 HubConnectionBuilder 上进行设置。 使用此设置,服务器可以检测强行断开连接的情况,例如客户断开其计算机的网络连接。 从客户端发送任何消息会将计时器重置为间隔的开始。 如果客户端在服务器设定的ClientTimeoutInterval时间内未发送消息,服务器会认为客户端已断开连接。

在 .NET 客户端中,超时值指定为 TimeSpan 值。

以下示例显示了两倍默认值的值:

var builder = new HubConnectionBuilder()
    .WithUrl(Navigation.ToAbsoluteUri("/chathub"))
    .WithServerTimeout(TimeSpan.FromSeconds(60))
    .WithKeepAliveInterval(TimeSpan.FromSeconds(30))
    .Build();

builder.On<string, string>("ReceiveMessage", (user, message) => ...

await builder.StartAsync();

配置监控状态的重新连接

SignalR 有状态重连可以减少客户端因网络连接暂时中断(例如在切换网络连接或短暂失去访问权限时)而感知到的停机时间。

有状态重新连接可通过以下方式实现此目的:

  • 暂时缓冲服务器和客户端上的数据。
  • 服务端和客户端对收到的消息进行确认(ACK)。
  • 识别连接何时启动并重播连接关闭时可能已发送的消息。

有状态重连在 .NET 8 或更高版本中可用。

在服务器中心终结点和客户端处选择加入监控状态的重新连接:

  • 更新服务器中心终结点配置以启用 AllowStatefulReconnects 选项:

    app.MapHub<MyHub>("/hubName", options =>
    {
        options.AllowStatefulReconnects = true;
    });
    

    (可选)可以全局设置服务器允许的最大缓冲区大小(以字节为单位),也可以使用 StatefulReconnectBufferSize 选项针对特定的中心进行设置:

    全局设置的 StatefulReconnectBufferSize 选项:

    builder.AddSignalR(o => o.StatefulReconnectBufferSize = 1000);
    

    针对特定中心进行设置的 StatefulReconnectBufferSize 选项:

    builder.AddSignalR().AddHubOptions<MyHub>(o => o.StatefulReconnectBufferSize = 1000);
    

    StatefulReconnectBufferSize 选项是可选的,默认值为 100,000 字节。

  • 更新 JavaScript 或 TypeScript 客户端代码,以启用 withStatefulReconnect 选项:

    const builder = new signalR.HubConnectionBuilder()
      .withUrl("/hubname")
      .withStatefulReconnect({ bufferSize: 1000 });  // Optional, defaults to 100,000
    const connection = builder.build();
    

    bufferSize 选项是可选的,默认值为 100,000 字节。

  • 更新 .NET 客户端代码以启用 WithStatefulReconnect 选项:

      var builder = new HubConnectionBuilder()
          .WithUrl("<hub url>")
          .WithStatefulReconnect();
      builder.Services.Configure<HubConnectionOptions>(o => o.StatefulReconnectBufferSize = 1000);
      var hubConnection = builder.Build();
    

    StatefulReconnectBufferSize 选项是可选的,默认值为 100,000 字节。

配置附加选项

可以在WithUrlwithUrl方法中(在 JavaScript 中为HubConnectionBuilder)或 Java 客户端中的HttpHubConnectionBuilder上的各种配置 API 中配置其他选项。

.NET 选项 默认值 DESCRIPTION
AccessTokenProvider null 一个函数,返回在 HTTP 请求中作为持有者身份验证令牌提供的字符串。
SkipNegotiation false 将此项设置为 true 跳过协商步骤。 仅当 WebSocket 传输是唯一启用的传输时才支持。 使用 Azure SignalR 服务时,无法启用此设置。
ClientCertificates 用于验证请求的 TLS 证书集合。
Cookies 要随每个 HTTP 请求一起发送的 HTTP Cookie 集合。
Credentials 要随每个 HTTP 请求一起发送的凭据。
CloseTimeout 5 秒 仅 WebSocket。 客户端在关闭后等待的最大时间,以便服务器确认关闭请求。 如果服务器在此时间内未确认关闭,客户端会断开连接。
Headers 要随每个 HTTP 请求一起发送的其他 HTTP 标头的映射。
HttpMessageHandlerFactory null 一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler。 不用于 WebSocket 连接。 此委托必须返回非 null 值,并接收默认值作为参数。 修改该默认值的设置并返回,或返回新 HttpMessageHandler 实例。 替换处理程序时,请确保复制要从提供的处理程序中保留的设置,否则,配置的选项(如 Cookie 和标头)将不适用于新处理程序。
Proxy null 发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentials false 设置此布尔值以发送 HTTP 和 WebSocket 请求的默认凭据。 这样就可以使用 Windows 身份验证。
WebSocketConfiguration null 可用于配置其他 WebSocket 选项的委托。 接收可用于配置选项的 ClientWebSocketOptions 实例。
ApplicationMaxBufferSize 1 MB 在应用反压之前,客户端从服务器接收并缓冲的最大字节数。 增加此值可让客户端更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
TransportMaxBufferSize 1 MB 客户端在观察到反压之前所缓冲的由用户应用程序发送的字节的最大数目。 增加此值可让客户端更快地缓冲较大的消息,而无需等待反压,但会增加内存消耗。

在 .NET 客户端中,这些选项可以通过提供给 WithUrl 的选项委托来修改。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

在 JavaScript 客户端中,可以在提供给以下对象的 withUrlJavaScript 对象中提供这些选项:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

在 Java 客户端中,可以通过 HttpHubConnectionBuilder 返回的 HubConnectionBuilder.create("HUB URL") 上的方法配置这些选项。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

其他资源

JSON/MessagePack 序列化选项

ASP.NET Core SignalR 支持两种编码消息的协议: JSONMessagePack。 各个协议都有可用于序列化的配置选项。

在服务器上可以使用AddJsonProtocol扩展方法配置 JSON 序列化,该扩展方法可以在AddSignalR方法中的Startup.ConfigureServices之后添加。 AddJsonProtocol 方法采用接收 options 对象的委托。 该 PayloadSerializerSettings 对象的属性是一个 Json.NET JsonSerializerSettings 对象,可用于配置参数和返回值的序列化。 有关详细信息,请参阅 Json.NET 文档

例如,若要将序列化程序配置为使用“PascalCase”属性名称,而不是默认的 camelCase 名称,请使用以下代码 Startup.ConfigureServices

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

在 .NET 客户端中,AddJsonProtocol 上有相同的 HubConnectionBuilder 扩展方法。 必须导入Microsoft.Extensions.DependencyInjection命名空间以解析扩展方法。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

注释

目前无法在 JavaScript 客户端中配置 JSON 序列化。

MessagePack 序列化选项

可以通过向 AddMessagePackProtocol 调用提供委托来配置 MessagePack 序列化。 有关更多详细信息,请参阅 SignalR 中的 MessagePack

注释

目前无法在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 中心的选项:

选项 默认值 DESCRIPTION
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,则会关闭连接。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 如果服务器在此时间间隔内未发送消息,则会自动发送 ping 消息以保持连接打开状态。 更改 KeepAliveInterval时,更改客户端上的 ServerTimeout 设置或 serverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 如果在 trueHub 方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。

可以通过在 AddSignalR 中向 Startup.ConfigureServices 调用提供选项委托,为所有中心配置选项。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

单个集线器的选项将覆盖AddSignalR提供的全局选项,并且可以使用AddHubOptions进行配置。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高级 HTTP 配置选项

用于 HttpConnectionDispatcherOptions 配置与传输和内存缓冲区管理相关的高级设置。 通过将委托传递给 MapHub 中的 Startup.Configure 来配置这些选项。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

下表介绍了用于配置 ASP.NET Core SignalR的高级 HTTP 选项的选项:

选项 默认值 DESCRIPTION
ApplicationMaxBufferSize 32 KB 服务器所缓冲的从客户端接收到的字节的最大数目。 增加此值可让服务器接收更大的消息,但可能会对内存消耗产生负面影响。
AuthorizationData 从应用于 Hub 类的 Authorize 属性中自动收集的数据。 用于确定客户端是否有权连接到中心的对象列表 IAuthorizeData
TransportMaxBufferSize 32 KB 服务器所缓冲的由应用发送的字节的最大数目。 增加此值可使服务器发送更大的消息,但可能会对内存消耗产生负面影响。
Transports 所有传输都已启用。 位标志 HttpTransportType 值的枚举,这些值可限制客户端用于连接的传输。
LongPolling 请参阅下文。 特定于长轮询传输的其他选项。
WebSockets 请参阅下文。 特定于 WebSocket 传输的其他选项。

长轮询传输提供可使用 LongPolling 属性配置的其他选项:

选项 默认值 DESCRIPTION
PollTimeout 90 秒 服务器在终止单个轮询请求之前等待消息发送到客户端的最大时间。 降低此值会导致客户端更频繁地发出新的轮询请求。

WebSocket 传输具有可以使用属性 WebSockets 配置的其他选项:

选项 默认值 DESCRIPTION
CloseTimeout 5 秒 服务器关闭后,如果客户端在此时间间隔内未能关闭,连接将终止。
SubProtocolSelector null 一个委托,可用于将 Sec-WebSocket-Protocol 标头设置为自定义值。 委托接收客户端请求的值作为输入,并预期返回所需的值。

配置客户端选项

客户端选项可以在HubConnectionBuilder类型上配置(适用于 .NET 和 JavaScript 客户端)。 它在 Java 客户端中也可用,但 HttpHubConnectionBuilder 子类包含生成器配置选项以及 HubConnection 本身。

配置日志记录

.NET 客户端中的日志记录是使用 ConfigureLogging 方法配置的。 提供程序和筛选器的注册方式与它们在服务器上的注册方式相同。 有关详细信息,请参阅 ASP.NET Core 文档中的日志记录。

注释

若要注册日志记录提供程序,必须安装必要的包。 有关完整列表,请参阅文档的 内置日志记录提供程序 部分。

例如,若要启用控制台日志记录,请安装 Microsoft.Extensions.Logging.Console NuGet 包。 AddConsole调用扩展方法:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

在 JavaScript 客户端中,存在类似的 configureLogging 方法。 提供一个 LogLevel 值,该值指示要生成的日志消息的最小级别。 日志将写入浏览器控制台窗口。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

注释

若要完全禁用日志记录,请在signalR.LogLevel.None方法中指定configureLogging

有关日志记录的详细信息,请参阅 SignalR 诊断文档

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志记录 API,它允许用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段演示如何与 Java 客户端一起使用java.util.loggingSignalR。

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 来限制客户端仅使用指定的传输。 默认情况下,所有传输都处于启用状态。

例如,要禁用“服务器发送的事件”传输,但允许 WebSocket 和长轮询连接,请执行以下操作:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

在 JavaScript 客户端中,通过在传递给 transport 的选项对象上设置 withUrl 字段来配置传输方式。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

配置持有者身份验证

若要提供身份验证数据以及 SignalR 请求,请使用 AccessTokenProvider 选项(accessTokenFactory 在 JavaScript 中)指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP“持有者身份验证”令牌传入(将 Authorization 标头与类型 Bearer一起使用)。 在 JavaScript 客户端中,访问令牌充当持有者令牌,除了少数浏览器 API 会限制标头应用能力的情况(特别是在“服务器发送的事件”和 WebSocket 请求中)。 在这些情况下,访问令牌以查询字符串值 access_token的形式提供。

在 .NET 客户端中,可以使用 AccessTokenProvider 中的选项委托来指定 WithUrl 选项。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

在 JavaScript 客户端中,通过在以下选项对象accessTokenFactory上设置withUrl字段来配置访问令牌:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

在 Java 客户端中 SignalR ,可以通过向 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 对象本身上,可以配置超时和保持活动行为的其他选项。

选项 默认值 DESCRIPTION
ServerTimeout 30 秒(30,000 毫秒) 服务器活动的超时。 如果服务器在此间隔内未发送消息,客户端会考虑服务器已断开连接并触发 Closed 事件(onclose 在 JavaScript 中)。 此值必须足够大,才能从服务器发送 ping 消息 ,并在 超时间隔内由客户端接收。 建议的值至少是服务器 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout 15 秒 初始服务器握手的超时。 如果服务器在此间隔内未发送握手响应,客户端将取消握手并触发 Closed 事件(onclose 在 JavaScript 中)。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范

在 .NET 客户端中,超时值指定为 TimeSpan 值。

配置附加选项

可以在WithUrlwithUrl方法中(在 JavaScript 中为HubConnectionBuilder)或 Java 客户端中的HttpHubConnectionBuilder上的各种配置 API 中配置其他选项。

.NET 选项 默认值 DESCRIPTION
AccessTokenProvider null 一个函数,返回在 HTTP 请求中作为持有者身份验证令牌提供的字符串。
SkipNegotiation false 将此项设置为 true 跳过协商步骤。 仅当 WebSocket 传输是唯一启用的传输时才支持。 使用 Azure SignalR 服务时,无法启用此设置。
ClientCertificates 用于验证请求的 TLS 证书集合。
Cookies 要随每个 HTTP 请求一起发送的 HTTP Cookie 集合。
Credentials 要随每个 HTTP 请求一起发送的凭据。
CloseTimeout 5 秒 仅 WebSocket。 客户端在关闭后等待的最大时间,以便服务器确认关闭请求。 如果服务器在此时间内未确认关闭,客户端会断开连接。
Headers 要随每个 HTTP 请求一起发送的其他 HTTP 标头的映射。
HttpMessageHandlerFactory null 一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler。 不用于 WebSocket 连接。 此委托必须返回非 null 值,并接收默认值作为参数。 修改该默认值的设置并返回,或返回新 HttpMessageHandler 实例。 替换处理程序时,请确保复制要从提供的处理程序中保留的设置,否则,配置的选项(如 Cookie 和标头)将不适用于新处理程序。
Proxy null 发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentials false 设置此布尔值以发送 HTTP 和 WebSocket 请求的默认凭据。 这样就可以使用 Windows 身份验证。
WebSocketConfiguration null 可用于配置其他 WebSocket 选项的委托。 接收可用于配置选项的 ClientWebSocketOptions 实例。

在 .NET 客户端中,这些选项可以通过提供给 WithUrl 的选项委托来修改。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

在 JavaScript 客户端中,可以在提供给以下对象的 withUrlJavaScript 对象中提供这些选项:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

在 Java 客户端中,可以通过 HttpHubConnectionBuilder 返回的 HubConnectionBuilder.create("HUB URL") 上的方法配置这些选项。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

其他资源

JSON/MessagePack 序列化选项

ASP.NET Core SignalR 支持两种编码消息的协议: JSONMessagePack。 各个协议都有可用于序列化的配置选项。

在服务器上可以使用AddJsonProtocol扩展方法配置 JSON 序列化,该扩展方法可以在AddSignalR方法中的Startup.ConfigureServices之后添加。 AddJsonProtocol 方法采用接收 options 对象的委托。 该 PayloadSerializerSettings 对象的属性是一个 Json.NET JsonSerializerSettings 对象,可用于配置参数和返回值的序列化。 有关详细信息,请参阅 Json.NET 文档

例如,若要将序列化程序配置为使用“PascalCase”属性名称,而不是默认的 camelCase 名称,请使用以下代码 Startup.ConfigureServices

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    });

在 .NET 客户端中,AddJsonProtocol 上有相同的 HubConnectionBuilder 扩展方法。 必须导入Microsoft.Extensions.DependencyInjection命名空间以解析扩展方法。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerSettings.ContractResolver =
            new DefaultContractResolver();
    })
    .Build();

注释

目前无法在 JavaScript 客户端中配置 JSON 序列化。

MessagePack 序列化选项

可以通过向 AddMessagePackProtocol 调用提供委托来配置 MessagePack 序列化。 有关更多详细信息,请参阅 SignalR 中的 MessagePack

注释

目前无法在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 中心的选项:

选项 默认值 DESCRIPTION
ClientTimeoutInterval 30 秒 如果客户端未在此时间间隔内收到消息(包括保持活动状态),则服务器会将其视为已断开连接。 由于实现方式的不同,将客户端标记为断开连接可能需要更长的超时间隔时间。 建议的值是两倍 KeepAliveInterval 的值。
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,则会关闭连接。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 如果服务器在此时间间隔内未发送消息,则会自动发送 ping 消息以保持连接打开状态。 更改 KeepAliveInterval时,更改客户端上的 ServerTimeout 设置或 serverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 如果在 trueHub 方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。

可以通过在 AddSignalR 中向 Startup.ConfigureServices 调用提供选项委托,为所有中心配置选项。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

单个集线器的选项将覆盖AddSignalR提供的全局选项,并且可以使用AddHubOptions进行配置。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高级 HTTP 配置选项

用于 HttpConnectionDispatcherOptions 配置与传输和内存缓冲区管理相关的高级设置。 通过将委托传递给 MapHub 中的 Startup.Configure 来配置这些选项。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseSignalR((configure) =>
    {
        var desiredTransports =
            HttpTransportType.WebSockets |
            HttpTransportType.LongPolling;

        configure.MapHub<ChatHub>("/chathub", (options) =>
        {
            options.Transports = desiredTransports;
        });
    });
}

下表介绍了用于配置 ASP.NET Core SignalR的高级 HTTP 选项的选项:

选项 默认值 DESCRIPTION
ApplicationMaxBufferSize 32 KB 服务器所缓冲的从客户端接收到的字节的最大数目。 增加此值可让服务器接收更大的消息,但可能会对内存消耗产生负面影响。
AuthorizationData 从应用于 Hub 类的 Authorize 属性中自动收集的数据。 用于确定客户端是否有权连接到中心的对象列表 IAuthorizeData
TransportMaxBufferSize 32 KB 服务器所缓冲的由应用发送的字节的最大数目。 增加此值可使服务器发送更大的消息,但可能会对内存消耗产生负面影响。
Transports 所有传输都已启用。 位标志 HttpTransportType 值的枚举,这些值可限制客户端用于连接的传输。
LongPolling 请参阅下文。 特定于长轮询传输的其他选项。
WebSockets 请参阅下文。 特定于 WebSocket 传输的其他选项。

长轮询传输提供可使用 LongPolling 属性配置的其他选项:

选项 默认值 DESCRIPTION
PollTimeout 90 秒 服务器在终止单个轮询请求之前等待消息发送到客户端的最大时间。 降低此值会导致客户端更频繁地发出新的轮询请求。

WebSocket 传输具有可以使用属性 WebSockets 配置的其他选项:

选项 默认值 DESCRIPTION
CloseTimeout 5 秒 服务器关闭后,如果客户端在此时间间隔内未能关闭,连接将终止。
SubProtocolSelector null 一个委托,可用于将 Sec-WebSocket-Protocol 标头设置为自定义值。 委托接收客户端请求的值作为输入,并预期返回所需的值。

配置客户端选项

客户端选项可以在HubConnectionBuilder类型上配置(适用于 .NET 和 JavaScript 客户端)。 它在 Java 客户端中也可用,但 HttpHubConnectionBuilder 子类包含生成器配置选项以及 HubConnection 本身。

配置日志记录

.NET 客户端中的日志记录是使用 ConfigureLogging 方法配置的。 提供程序和筛选器的注册方式与它们在服务器上的注册方式相同。 有关详细信息,请参阅 ASP.NET Core 文档中的日志记录。

注释

若要注册日志记录提供程序,必须安装必要的包。 有关完整列表,请参阅文档的 内置日志记录提供程序 部分。

例如,若要启用控制台日志记录,请安装 Microsoft.Extensions.Logging.Console NuGet 包。 AddConsole调用扩展方法:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

在 JavaScript 客户端中,存在类似的 configureLogging 方法。 提供一个 LogLevel 值,该值指示要生成的日志消息的最小级别。 日志将写入浏览器控制台窗口。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

注释

若要完全禁用日志记录,请在signalR.LogLevel.None方法中指定configureLogging

有关日志记录的详细信息,请参阅 SignalR 诊断文档

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志记录 API,它允许用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段演示如何与 Java 客户端一起使用java.util.loggingSignalR。

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 来限制客户端仅使用指定的传输。 默认情况下,所有传输都处于启用状态。

例如,要禁用“服务器发送的事件”传输,但允许 WebSocket 和长轮询连接,请执行以下操作:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

在 JavaScript 客户端中,通过在传递给 transport 的选项对象上设置 withUrl 字段来配置传输方式。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

在此版本的 Java 客户端中,WebSocket 是唯一可用的传输方式。

配置持有者身份验证

若要提供身份验证数据以及 SignalR 请求,请使用 AccessTokenProvider 选项(accessTokenFactory 在 JavaScript 中)指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP“持有者身份验证”令牌传入(将 Authorization 标头与类型 Bearer一起使用)。 在 JavaScript 客户端中,访问令牌充当持有者令牌,除了少数浏览器 API 会限制标头应用能力的情况(特别是在“服务器发送的事件”和 WebSocket 请求中)。 在这些情况下,访问令牌以查询字符串值 access_token的形式提供。

在 .NET 客户端中,可以使用 AccessTokenProvider 中的选项委托来指定 WithUrl 选项。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

在 JavaScript 客户端中,通过在以下选项对象accessTokenFactory上设置withUrl字段来配置访问令牌:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

在 Java 客户端中 SignalR ,可以通过向 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 对象本身上,可以配置超时和保持活动行为的其他选项。

选项 默认值 DESCRIPTION
ServerTimeout 30 秒(30,000 毫秒) 服务器活动的超时。 如果服务器在此间隔内未发送消息,客户端会考虑服务器已断开连接并触发 Closed 事件(onclose 在 JavaScript 中)。 此值必须足够大,才能从服务器发送 ping 消息 ,并在 超时间隔内由客户端接收。 建议的值至少是服务器 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout 15 秒 初始服务器握手的超时。 如果服务器在此间隔内未发送握手响应,客户端将取消握手并触发 Closed 事件(onclose 在 JavaScript 中)。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 确定客户端发送 ping 消息的间隔。 从客户端发送任何消息会将计时器重置为间隔的开始。 如果客户端在服务器设定的ClientTimeoutInterval时间内未发送消息,服务器会认为客户端已断开连接。

在 .NET 客户端中,超时值指定为 TimeSpan 值。

配置附加选项

可以在WithUrlwithUrl方法中(在 JavaScript 中为HubConnectionBuilder)或 Java 客户端中的HttpHubConnectionBuilder上的各种配置 API 中配置其他选项。

.NET 选项 默认值 DESCRIPTION
AccessTokenProvider null 一个函数,返回在 HTTP 请求中作为持有者身份验证令牌提供的字符串。
SkipNegotiation false 将此项设置为 true 跳过协商步骤。 仅当 WebSocket 传输是唯一启用的传输时才支持。 使用 Azure SignalR 服务时,无法启用此设置。
ClientCertificates 用于验证请求的 TLS 证书集合。
Cookies 要随每个 HTTP 请求一起发送的 HTTP Cookie 集合。
Credentials 要随每个 HTTP 请求一起发送的凭据。
CloseTimeout 5 秒 仅 WebSocket。 客户端在关闭后等待的最大时间,以便服务器确认关闭请求。 如果服务器在此时间内未确认关闭,客户端会断开连接。
Headers 要随每个 HTTP 请求一起发送的其他 HTTP 标头的映射。
HttpMessageHandlerFactory null 一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler。 不用于 WebSocket 连接。 此委托必须返回非 null 值,并接收默认值作为参数。 修改该默认值的设置并返回,或返回新 HttpMessageHandler 实例。 替换处理程序时,请确保复制要从提供的处理程序中保留的设置,否则,配置的选项(如 Cookie 和标头)将不适用于新处理程序。
Proxy null 发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentials false 设置此布尔值以发送 HTTP 和 WebSocket 请求的默认凭据。 这样就可以使用 Windows 身份验证。
WebSocketConfiguration null 可用于配置其他 WebSocket 选项的委托。 接收可用于配置选项的 ClientWebSocketOptions 实例。

在 .NET 客户端中,这些选项可以通过提供给 WithUrl 的选项委托来修改。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

在 JavaScript 客户端中,可以在提供给以下对象的 withUrlJavaScript 对象中提供这些选项:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

在 Java 客户端中,可以通过 HttpHubConnectionBuilder 返回的 HubConnectionBuilder.create("HUB URL") 上的方法配置这些选项。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

其他资源

JSON/MessagePack 序列化选项

ASP.NET Core SignalR 支持两种编码消息的协议: JSONMessagePack。 各个协议都有可用于序列化的配置选项。

可以在服务器上使用 AddJsonProtocol 扩展方法来配置 JSON 序列化。 可将 AddJsonProtocol 添加到 AddSignalR 中的 Startup.ConfigureServices 之后。 AddJsonProtocol 方法采用接收 options 对象的委托。 该 PayloadSerializerOptions 对象的属性是一个 System.Text.JsonJsonSerializerOptions 对象,可用于配置参数和返回值的序列化。 有关详细信息,请参阅 System.Text.Json 文档

例如,要将序列化程序配置为不更改属性名称的大小写,但又不使用默认的大小写名称,请在 Startup.ConfigureServices 中使用以下代码:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

在 .NET 客户端中,AddJsonProtocol 上有相同的 HubConnectionBuilder 扩展方法。 必须导入Microsoft.Extensions.DependencyInjection命名空间以解析扩展方法。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

注释

目前无法在 JavaScript 客户端中配置 JSON 序列化。

切换到 Newtonsoft.Json

如果需要 Newtonsoft.Json 中不支持的 System.Text.Json 功能,请参阅切换到 Newtonsoft.Json

MessagePack 序列化选项

可以通过向 AddMessagePackProtocol 调用提供委托来配置 MessagePack 序列化。 有关更多详细信息,请参阅 SignalR 中的 MessagePack

注释

目前无法在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 中心的选项:

选项 默认值 DESCRIPTION
ClientTimeoutInterval 30 秒 如果客户端未在此时间间隔内收到消息(包括保持活动状态),则服务器会将其视为已断开连接。 由于实现方式的不同,将客户端标记为断开连接可能需要更长的超时间隔时间。 建议的值是两倍 KeepAliveInterval 的值。
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,则会关闭连接。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 如果服务器在此时间间隔内未发送消息,则会自动发送 ping 消息以保持连接打开状态。 更改 KeepAliveInterval时,更改客户端上的 ServerTimeout 设置或 serverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 如果在 trueHub 方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。
StreamBufferCapacity 10 可以为客户端上传流缓冲的最大项数。 如果达到此限制,将阻止调用的处理,直到服务器处理流项。
MaximumReceiveMessageSize 32 KB 单个传入中心消息的最大大小。 增加此值可能会增加 拒绝服务(DoS)攻击的风险。

可以通过在 AddSignalR 中向 Startup.ConfigureServices 调用提供选项委托,为所有中心配置选项。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

单个集线器的选项将覆盖AddSignalR提供的全局选项,并且可以使用AddHubOptions进行配置。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高级 HTTP 配置选项

用于 HttpConnectionDispatcherOptions 配置与传输和内存缓冲区管理相关的高级设置。 通过将委托传递给 MapHub 中的 Startup.Configure 来配置这些选项。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

下表介绍了用于配置 ASP.NET Core SignalR的高级 HTTP 选项的选项:

选项 默认值 DESCRIPTION
ApplicationMaxBufferSize 32 KB 在应用反压之前,服务器所缓冲的从客户端接收到的字节的最大数目。 增加此值可让服务器更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
AuthorizationData 从应用于 Hub 类的 Authorize 属性中自动收集的数据。 用于确定客户端是否有权连接到中心的对象列表 IAuthorizeData
TransportMaxBufferSize 32 KB 服务器在观察到反压之前所缓冲的由应用发送的字节的最大数目。 增加此值可使服务器更快地缓冲较大的消息,而无需等待反压,但可能会增加内存消耗。
Transports 所有传输都已启用。 位标志 HttpTransportType 值的枚举,这些值可限制客户端用于连接的传输。
LongPolling 请参阅下文。 特定于长轮询传输的其他选项。
WebSockets 请参阅下文。 特定于 WebSocket 传输的其他选项。

长轮询传输提供可使用 LongPolling 属性配置的其他选项:

选项 默认值 DESCRIPTION
PollTimeout 90 秒 服务器在终止单个轮询请求之前等待消息发送到客户端的最大时间。 降低此值会导致客户端更频繁地发出新的轮询请求。

WebSocket 传输具有可以使用属性 WebSockets 配置的其他选项:

选项 默认值 DESCRIPTION
CloseTimeout 5 秒 服务器关闭后,如果客户端在此时间间隔内未能关闭,连接将终止。
SubProtocolSelector null 一个委托,可用于将 Sec-WebSocket-Protocol 标头设置为自定义值。 委托接收客户端请求的值作为输入,并预期返回所需的值。

配置客户端选项

客户端选项可以在HubConnectionBuilder类型上配置(适用于 .NET 和 JavaScript 客户端)。 它在 Java 客户端中也可用,但 HttpHubConnectionBuilder 子类包含生成器配置选项以及 HubConnection 本身。

配置日志记录

.NET 客户端中的日志记录是使用 ConfigureLogging 方法配置的。 提供程序和筛选器的注册方式与它们在服务器上的注册方式相同。 有关详细信息,请参阅 ASP.NET Core 文档中的日志记录。

注释

若要注册日志记录提供程序,必须安装必要的包。 有关完整列表,请参阅文档的 内置日志记录提供程序 部分。

例如,若要启用控制台日志记录,请安装 Microsoft.Extensions.Logging.Console NuGet 包。 AddConsole调用扩展方法:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

在 JavaScript 客户端中,存在类似的 configureLogging 方法。 提供一个 LogLevel 值,该值指示要生成的日志消息的最小级别。 日志将写入浏览器控制台窗口。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

还可以提供表示日志级别名称的 LogLevel 值,而不是 string 值。 在无权访问SignalR常量的环境中配置LogLevel日志记录时,这非常有用。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

下表列出了可用的日志级别。 提供给configureLogging 的值将设置记录的最低日志级别。 将记录此级别的或表中该级别后面列出的级别的消息。

字符串 LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoinformation LogLevel.Information
warnwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

注释

若要完全禁用日志记录,请在signalR.LogLevel.None方法中指定configureLogging

有关日志记录的详细信息,请参阅 SignalR 诊断文档

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志记录 API,它允许用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段演示如何与 Java 客户端一起使用java.util.loggingSignalR。

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 来限制客户端仅使用指定的传输。 默认情况下,所有传输都处于启用状态。

例如,要禁用“服务器发送的事件”传输,但允许 WebSocket 和长轮询连接,请执行以下操作:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

在 JavaScript 客户端中,通过在传递给 transport 的选项对象上设置 withUrl 字段来配置传输方式。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

在此版本的 Java 客户端中,WebSocket 是唯一可用的传输方式。

在 Java 客户端中,通过withTransport方法在HttpHubConnectionBuilder上选择传输。 Java 客户端默认使用 WebSocket 传输。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

注释

SignalR Java 客户端尚不支持传输回退。

配置持有者身份验证

若要提供身份验证数据以及 SignalR 请求,请使用 AccessTokenProvider 选项(accessTokenFactory 在 JavaScript 中)指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP“持有者身份验证”令牌传入(将 Authorization 标头与类型 Bearer一起使用)。 在 JavaScript 客户端中,访问令牌充当持有者令牌,除了少数浏览器 API 会限制标头应用能力的情况(特别是在“服务器发送的事件”和 WebSocket 请求中)。 在这些情况下,访问令牌以查询字符串值 access_token的形式提供。

在 .NET 客户端中,可以使用 AccessTokenProvider 中的选项委托来指定 WithUrl 选项。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

在 JavaScript 客户端中,通过在以下选项对象accessTokenFactory上设置withUrl字段来配置访问令牌:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

在 Java 客户端中 SignalR ,可以通过向 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 对象本身上,可以配置超时和保持活动行为的其他选项。

选项 默认值 DESCRIPTION
ServerTimeout 30 秒(30,000 毫秒) 服务器活动的超时。 如果服务器在此间隔内未发送消息,客户端会考虑服务器已断开连接并触发 Closed 事件(onclose 在 JavaScript 中)。 此值必须足够大,才能从服务器发送 ping 消息 ,并在 超时间隔内由客户端接收。 建议的值至少是服务器 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout 15 秒 初始服务器握手的超时。 如果服务器在此间隔内未发送握手响应,客户端将取消握手并触发 Closed 事件(onclose 在 JavaScript 中)。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 确定客户端发送 ping 消息的间隔。 从客户端发送任何消息会将计时器重置为间隔的开始。 如果客户端在服务器设定的ClientTimeoutInterval时间内未发送消息,服务器会认为客户端已断开连接。

在 .NET 客户端中,超时值指定为 TimeSpan 值。

配置附加选项

可以在WithUrlwithUrl方法中(在 JavaScript 中为HubConnectionBuilder)或 Java 客户端中的HttpHubConnectionBuilder上的各种配置 API 中配置其他选项。

.NET 选项 默认值 DESCRIPTION
AccessTokenProvider null 一个函数,返回在 HTTP 请求中作为持有者身份验证令牌提供的字符串。
SkipNegotiation false 将此项设置为 true 跳过协商步骤。 仅当 WebSocket 传输是唯一启用的传输时才支持。 使用 Azure SignalR 服务时,无法启用此设置。
ClientCertificates 用于验证请求的 TLS 证书集合。
Cookies 要随每个 HTTP 请求一起发送的 HTTP Cookie 集合。
Credentials 要随每个 HTTP 请求一起发送的凭据。
CloseTimeout 5 秒 仅 WebSocket。 客户端在关闭后等待的最大时间,以便服务器确认关闭请求。 如果服务器在此时间内未确认关闭,客户端会断开连接。
Headers 要随每个 HTTP 请求一起发送的其他 HTTP 标头的映射。
HttpMessageHandlerFactory null 一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler。 不用于 WebSocket 连接。 此委托必须返回非 null 值,并接收默认值作为参数。 修改该默认值的设置并返回,或返回新 HttpMessageHandler 实例。 替换处理程序时,请确保复制要从提供的处理程序中保留的设置,否则,配置的选项(如 Cookie 和标头)将不适用于新处理程序。
Proxy null 发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentials false 设置此布尔值以发送 HTTP 和 WebSocket 请求的默认凭据。 这样就可以使用 Windows 身份验证。
WebSocketConfiguration null 可用于配置其他 WebSocket 选项的委托。 接收可用于配置选项的 ClientWebSocketOptions 实例。

在 .NET 客户端中,这些选项可以通过提供给 WithUrl 的选项委托来修改。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

在 JavaScript 客户端中,可以在提供给以下对象的 withUrlJavaScript 对象中提供这些选项:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

在 Java 客户端中,可以通过 HttpHubConnectionBuilder 返回的 HubConnectionBuilder.create("HUB URL") 上的方法配置这些选项。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

其他资源

JSON/MessagePack 序列化选项

ASP.NET Core SignalR 支持两种编码消息的协议: JSONMessagePack。 各个协议都有可用于序列化的配置选项。

可以在服务器上使用 AddJsonProtocol 扩展方法来配置 JSON 序列化。 可将 AddJsonProtocol 添加到 AddSignalR 中的 Startup.ConfigureServices 之后。 AddJsonProtocol 方法采用接收 options 对象的委托。 该 PayloadSerializerOptions 对象的属性是一个 System.Text.JsonJsonSerializerOptions 对象,可用于配置参数和返回值的序列化。 有关详细信息,请参阅 System.Text.Json 文档

例如,要将序列化程序配置为不更改属性名称的大小写,但又不使用默认的大小写名称,请在 Startup.ConfigureServices 中使用以下代码:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null
    });

在 .NET 客户端中,AddJsonProtocol 上有相同的 HubConnectionBuilder 扩展方法。 必须导入Microsoft.Extensions.DependencyInjection命名空间以解析扩展方法。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

注释

目前无法在 JavaScript 客户端中配置 JSON 序列化。

切换到 Newtonsoft.Json

如果需要 Newtonsoft.Json 中不支持的 System.Text.Json 功能,请参阅切换到 Newtonsoft.Json

MessagePack 序列化选项

可以通过向 AddMessagePackProtocol 调用提供委托来配置 MessagePack 序列化。 有关更多详细信息,请参阅 SignalR 中的 MessagePack

注释

目前无法在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 中心的选项:

选项 默认值 DESCRIPTION
ClientTimeoutInterval 30 秒 如果客户端未在此时间间隔内收到消息(包括保持活动状态),则服务器会将其视为已断开连接。 由于实现方式的不同,将客户端标记为断开连接可能需要更长的超时间隔时间。 建议的值是两倍 KeepAliveInterval 的值。
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,则会关闭连接。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 如果服务器在此时间间隔内未发送消息,则会自动发送 ping 消息以保持连接打开状态。 更改 KeepAliveInterval时,更改客户端上的 ServerTimeout 设置或 serverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 如果在 trueHub 方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。
StreamBufferCapacity 10 可以为客户端上传流缓冲的最大项数。 如果达到此限制,将阻止调用的处理,直到服务器处理流项。
MaximumReceiveMessageSize 32 KB 单个传入中心消息的最大大小。 增加此值可能会增加 拒绝服务(DoS)攻击的风险。

可以通过在 AddSignalR 中向 Startup.ConfigureServices 调用提供选项委托,为所有中心配置选项。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

单个集线器的选项将覆盖AddSignalR提供的全局选项,并且可以使用AddHubOptions进行配置。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高级 HTTP 配置选项

用于 HttpConnectionDispatcherOptions 配置与传输和内存缓冲区管理相关的高级设置。 通过将委托传递给 MapHub 中的 Startup.Configure 来配置这些选项。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

下表介绍了用于配置 ASP.NET Core SignalR的高级 HTTP 选项的选项:

选项 默认值 DESCRIPTION
ApplicationMaxBufferSize 32 KB 在应用反压之前,服务器所缓冲的从客户端接收到的字节的最大数目。 增加此值可让服务器更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
AuthorizationData 从应用于 Hub 类的 Authorize 属性中自动收集的数据。 用于确定客户端是否有权连接到中心的对象列表 IAuthorizeData
TransportMaxBufferSize 32 KB 服务器在观察到反压之前所缓冲的由应用发送的字节的最大数目。 增加此值可使服务器更快地缓冲较大的消息,而无需等待反压,但可能会增加内存消耗。
Transports 所有传输都已启用。 位标志 HttpTransportType 值的枚举,这些值可限制客户端用于连接的传输。
LongPolling 请参阅下文。 特定于长轮询传输的其他选项。
WebSockets 请参阅下文。 特定于 WebSocket 传输的其他选项。
MinimumProtocolVersion 0 指定协商协议的最低版本。 这用于将客户端限制为较新版本。

长轮询传输提供可使用 LongPolling 属性配置的其他选项:

选项 默认值 DESCRIPTION
PollTimeout 90 秒 服务器在终止单个轮询请求之前等待消息发送到客户端的最大时间。 降低此值会导致客户端更频繁地发出新的轮询请求。

WebSocket 传输具有可以使用属性 WebSockets 配置的其他选项:

选项 默认值 DESCRIPTION
CloseTimeout 5 秒 服务器关闭后,如果客户端在此时间间隔内未能关闭,连接将终止。
SubProtocolSelector null 一个委托,可用于将 Sec-WebSocket-Protocol 标头设置为自定义值。 委托接收客户端请求的值作为输入,并预期返回所需的值。

配置客户端选项

客户端选项可以在HubConnectionBuilder类型上配置(适用于 .NET 和 JavaScript 客户端)。 它在 Java 客户端中也可用,但 HttpHubConnectionBuilder 子类包含生成器配置选项以及 HubConnection 本身。

配置日志记录

.NET 客户端中的日志记录是使用 ConfigureLogging 方法配置的。 提供程序和筛选器的注册方式与它们在服务器上的注册方式相同。 有关详细信息,请参阅 ASP.NET Core 文档中的日志记录。

注释

若要注册日志记录提供程序,必须安装必要的包。 有关完整列表,请参阅文档的 内置日志记录提供程序 部分。

例如,若要启用控制台日志记录,请安装 Microsoft.Extensions.Logging.Console NuGet 包。 AddConsole调用扩展方法:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

在 JavaScript 客户端中,存在类似的 configureLogging 方法。 提供一个 LogLevel 值,该值指示要生成的日志消息的最小级别。 日志将写入浏览器控制台窗口。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

还可以提供表示日志级别名称的 LogLevel 值,而不是 string 值。 在无权访问SignalR常量的环境中配置LogLevel日志记录时,这非常有用。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

下表列出了可用的日志级别。 提供给configureLogging 的值将设置记录的最低日志级别。 将记录此级别的或表中该级别后面列出的级别的消息。

字符串 LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoinformation LogLevel.Information
warnwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

注释

若要完全禁用日志记录,请在signalR.LogLevel.None方法中指定configureLogging

有关日志记录的详细信息,请参阅 SignalR 诊断文档

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志记录 API,它允许用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段演示如何与 Java 客户端一起使用java.util.loggingSignalR。

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 来限制客户端仅使用指定的传输。 默认情况下,所有传输都处于启用状态。

例如,要禁用“服务器发送的事件”传输,但允许 WebSocket 和长轮询连接,请执行以下操作:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

在 JavaScript 客户端中,通过在传递给 transport 的选项对象上设置 withUrl 字段来配置传输方式。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

在此版本的 Java 客户端中,WebSocket 是唯一可用的传输方式。

在 Java 客户端中,通过withTransport方法在HttpHubConnectionBuilder上选择传输。 Java 客户端默认使用 WebSocket 传输。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

注释

SignalR Java 客户端尚不支持传输回退。

配置持有者身份验证

若要提供身份验证数据以及 SignalR 请求,请使用 AccessTokenProvider 选项(accessTokenFactory 在 JavaScript 中)指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP“持有者身份验证”令牌传入(将 Authorization 标头与类型 Bearer一起使用)。 在 JavaScript 客户端中,访问令牌充当持有者令牌,除了少数浏览器 API 会限制标头应用能力的情况(特别是在“服务器发送的事件”和 WebSocket 请求中)。 在这些情况下,访问令牌以查询字符串值 access_token的形式提供。

在 .NET 客户端中,可以使用 AccessTokenProvider 中的选项委托来指定 WithUrl 选项。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

在 JavaScript 客户端中,通过在以下选项对象accessTokenFactory上设置withUrl字段来配置访问令牌:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

在 Java 客户端中 SignalR ,可以通过向 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 对象本身上,可以配置超时和保持活动行为的其他选项。

选项 默认值 DESCRIPTION
ServerTimeout 30 秒(30,000 毫秒) 服务器活动的超时。 如果服务器在此间隔内未发送消息,客户端会考虑服务器已断开连接并触发 Closed 事件(onclose 在 JavaScript 中)。 此值必须足够大,才能从服务器发送 ping 消息 ,并在 超时间隔内由客户端接收。 建议的值至少是服务器 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout 15 秒 初始服务器握手的超时。 如果服务器在此间隔内未发送握手响应,客户端将取消握手并触发 Closed 事件(onclose 在 JavaScript 中)。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 确定客户端发送 ping 消息的间隔。 从客户端发送任何消息会将计时器重置为间隔的开始。 如果客户端在服务器设定的ClientTimeoutInterval时间内未发送消息,服务器会认为客户端已断开连接。

在 .NET 客户端中,超时值指定为 TimeSpan 值。

配置附加选项

可以在WithUrlwithUrl方法中(在 JavaScript 中为HubConnectionBuilder)或 Java 客户端中的HttpHubConnectionBuilder上的各种配置 API 中配置其他选项。

.NET 选项 默认值 DESCRIPTION
AccessTokenProvider null 一个函数,返回在 HTTP 请求中作为持有者身份验证令牌提供的字符串。
SkipNegotiation false 将此项设置为 true 跳过协商步骤。 仅当 WebSocket 传输是唯一启用的传输时才支持。 使用 Azure SignalR 服务时,无法启用此设置。
ClientCertificates 用于验证请求的 TLS 证书集合。
Cookies 要随每个 HTTP 请求一起发送的 HTTP Cookie 集合。
Credentials 要随每个 HTTP 请求一起发送的凭据。
CloseTimeout 5 秒 仅 WebSocket。 客户端在关闭后等待的最大时间,以便服务器确认关闭请求。 如果服务器在此时间内未确认关闭,客户端会断开连接。
Headers 要随每个 HTTP 请求一起发送的其他 HTTP 标头的映射。
HttpMessageHandlerFactory null 一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler。 不用于 WebSocket 连接。 此委托必须返回非 null 值,并接收默认值作为参数。 修改该默认值的设置并返回,或返回新 HttpMessageHandler 实例。 替换处理程序时,请确保复制要从提供的处理程序中保留的设置,否则,配置的选项(如 Cookie 和标头)将不适用于新处理程序。
Proxy null 发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentials false 设置此布尔值以发送 HTTP 和 WebSocket 请求的默认凭据。 这样就可以使用 Windows 身份验证。
WebSocketConfiguration null 可用于配置其他 WebSocket 选项的委托。 接收可用于配置选项的 ClientWebSocketOptions 实例。

在 .NET 客户端中,这些选项可以通过提供给 WithUrl 的选项委托来修改。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

在 JavaScript 客户端中,可以在提供给以下对象的 withUrlJavaScript 对象中提供这些选项:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        skipNegotiation: true,
        transport: signalR.HttpTransportType.WebSockets
    })
    .build();

在 Java 客户端中,可以通过 HttpHubConnectionBuilder 返回的 HubConnectionBuilder.create("HUB URL") 上的方法配置这些选项。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

其他资源

JSON/MessagePack 序列化选项

ASP.NET Core SignalR 支持两种编码消息的协议: JSONMessagePack。 各个协议都有可用于序列化的配置选项。

可以在服务器上使用 AddJsonProtocol 扩展方法来配置 JSON 序列化。 可将 AddJsonProtocol 添加到 AddSignalR 中的 Startup.ConfigureServices 之后。 AddJsonProtocol 方法采用接收 options 对象的委托。 该 PayloadSerializerOptions 对象的属性是一个 System.Text.JsonJsonSerializerOptions 对象,可用于配置参数和返回值的序列化。 有关详细信息,请参阅 System.Text.Json 文档

例如,要将序列化程序配置为不更改属性名称的大小写,但又不使用默认的大小写名称,请在 Startup.ConfigureServices 中使用以下代码:

services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

在 .NET 客户端中,AddJsonProtocol 上有相同的 HubConnectionBuilder 扩展方法。 必须导入Microsoft.Extensions.DependencyInjection命名空间以解析扩展方法。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

注释

目前无法在 JavaScript 客户端中配置 JSON 序列化。

切换到 Newtonsoft.Json

如果需要 Newtonsoft.Json 中不支持的 System.Text.Json 功能,请参阅切换到 Newtonsoft.Json

MessagePack 序列化选项

可以通过向 AddMessagePackProtocol 调用提供委托来配置 MessagePack 序列化。 有关更多详细信息,请参阅 SignalR 中的 MessagePack

注释

目前无法在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 中心的选项:

选项 默认值 DESCRIPTION
ClientTimeoutInterval 30 秒 如果客户端未在此时间间隔内收到消息(包括保持活动状态),则服务器会将其视为已断开连接。 由于实现方式的不同,将客户端标记为断开连接可能需要更长的超时间隔时间。 建议的值是两倍 KeepAliveInterval 的值。
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,则会关闭连接。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 如果服务器在此时间间隔内未发送消息,则会自动发送 ping 消息以保持连接打开状态。 更改 KeepAliveInterval时,更改客户端上的 ServerTimeout 设置或 serverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 如果在 trueHub 方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。
StreamBufferCapacity 10 可以为客户端上传流缓冲的最大项数。 如果达到此限制,将阻止调用的处理,直到服务器处理流项。
MaximumReceiveMessageSize 32 KB 单个传入中心消息的最大大小。 增加此值可能会增加 拒绝服务(DoS)攻击的风险。
MaximumParallelInvocationsPerClient 1 在排队之前,每个客户端可以并行调用的中心方法的最大数量。

可以通过在 AddSignalR 中向 Startup.ConfigureServices 调用提供选项委托,为所有中心配置选项。

public void ConfigureServices(IServiceCollection services)
{
    services.AddSignalR(hubOptions =>
    {
        hubOptions.EnableDetailedErrors = true;
        hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
    });
}

单个集线器的选项将覆盖AddSignalR提供的全局选项,并且可以使用AddHubOptions进行配置。

services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高级 HTTP 配置选项

用于 HttpConnectionDispatcherOptions 配置与传输和内存缓冲区管理相关的高级设置。 通过将委托传递给 MapHub 中的 Startup.Configure 来配置这些选项。

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    app.UseRouting();

    app.UseEndpoints(endpoints =>
    {
        endpoints.MapHub<ChatHub>("/chathub", options =>
        {
            options.Transports =
                HttpTransportType.WebSockets |
                HttpTransportType.LongPolling;
        });
    });
}

下表介绍了用于配置 ASP.NET Core SignalR的高级 HTTP 选项的选项:

选项 默认值 DESCRIPTION
ApplicationMaxBufferSize 32 KB 在应用反压之前,服务器所缓冲的从客户端接收到的字节的最大数目。 增加此值可让服务器更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
AuthorizationData 从应用于 Hub 类的 Authorize 属性中自动收集的数据。 用于确定客户端是否有权连接到中心的对象列表 IAuthorizeData
TransportMaxBufferSize 32 KB 服务器在观察到反压之前所缓冲的由应用发送的字节的最大数目。 增加此值可使服务器更快地缓冲较大的消息,而无需等待反压,但可能会增加内存消耗。
Transports 所有传输都已启用。 位标志 HttpTransportType 值的枚举,这些值可限制客户端用于连接的传输。
LongPolling 请参阅下文。 特定于长轮询传输的其他选项。
WebSockets 请参阅下文。 特定于 WebSocket 传输的其他选项。
MinimumProtocolVersion 0 指定协商协议的最低版本。 这用于将客户端限制为较新版本。

长轮询传输提供可使用 LongPolling 属性配置的其他选项:

选项 默认值 DESCRIPTION
PollTimeout 90 秒 服务器在终止单个轮询请求之前等待消息发送到客户端的最大时间。 降低此值会导致客户端更频繁地发出新的轮询请求。

WebSocket 传输具有可以使用属性 WebSockets 配置的其他选项:

选项 默认值 DESCRIPTION
CloseTimeout 5 秒 服务器关闭后,如果客户端在此时间间隔内未能关闭,连接将终止。
SubProtocolSelector null 一个委托,可用于将 Sec-WebSocket-Protocol 标头设置为自定义值。 委托接收客户端请求的值作为输入,并预期返回所需的值。

配置客户端选项

客户端选项可以在HubConnectionBuilder类型上配置(适用于 .NET 和 JavaScript 客户端)。 它在 Java 客户端中也可用,但 HttpHubConnectionBuilder 子类包含生成器配置选项以及 HubConnection 本身。

配置日志记录

.NET 客户端中的日志记录是使用 ConfigureLogging 方法配置的。 提供程序和筛选器的注册方式与它们在服务器上的注册方式相同。 有关详细信息,请参阅 ASP.NET Core 文档中的日志记录。

注释

若要注册日志记录提供程序,必须安装必要的包。 有关完整列表,请参阅文档的 内置日志记录提供程序 部分。

例如,若要启用控制台日志记录,请安装 Microsoft.Extensions.Logging.Console NuGet 包。 AddConsole调用扩展方法:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

在 JavaScript 客户端中,存在类似的 configureLogging 方法。 提供一个 LogLevel 值,该值指示要生成的日志消息的最小级别。 日志将写入浏览器控制台窗口。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

还可以提供表示日志级别名称的 LogLevel 值,而不是 string 值。 在无权访问SignalR常量的环境中配置LogLevel日志记录时,这非常有用。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

下表列出了可用的日志级别。 提供给configureLogging 的值将设置记录的最低日志级别。 将记录此级别的或表中该级别后面列出的级别的消息。

字符串 LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoinformation LogLevel.Information
warnwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

注释

若要完全禁用日志记录,请在signalR.LogLevel.None方法中指定configureLogging

有关日志记录的详细信息,请参阅 SignalR 诊断文档

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志记录 API,它允许用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段演示如何与 Java 客户端一起使用java.util.loggingSignalR。

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 来限制客户端仅使用指定的传输。 默认情况下,所有传输都处于启用状态。

例如,要禁用“服务器发送的事件”传输,但允许 WebSocket 和长轮询连接,请执行以下操作:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

在 JavaScript 客户端中,通过在传递给 transport 的选项对象上设置 withUrl 字段来配置传输方式。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

在此版本的 Java 客户端中,WebSocket 是唯一可用的传输方式。

在 Java 客户端中,通过withTransport方法在HttpHubConnectionBuilder上选择传输。 Java 客户端默认使用 WebSocket 传输。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

注释

SignalR Java 客户端尚不支持传输回退。

配置持有者身份验证

若要提供身份验证数据以及 SignalR 请求,请使用 AccessTokenProvider 选项(accessTokenFactory 在 JavaScript 中)指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP“持有者身份验证”令牌传入(将 Authorization 标头与类型 Bearer一起使用)。 在 JavaScript 客户端中,访问令牌充当持有者令牌,除了少数浏览器 API 会限制标头应用能力的情况(特别是在“服务器发送的事件”和 WebSocket 请求中)。 在这些情况下,访问令牌以查询字符串值 access_token的形式提供。

在 .NET 客户端中,可以使用 AccessTokenProvider 中的选项委托来指定 WithUrl 选项。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

在 JavaScript 客户端中,通过在以下选项对象accessTokenFactory上设置withUrl字段来配置访问令牌:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

在 Java 客户端中 SignalR ,可以通过向 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 对象本身上,可以配置超时和保持活动行为的其他选项。

选项 默认值 DESCRIPTION
ServerTimeout 30 秒(30,000 毫秒) 服务器活动的超时。 如果服务器在此间隔内未发送消息,客户端会考虑服务器已断开连接并触发 Closed 事件(onclose 在 JavaScript 中)。 此值必须足够大,才能从服务器发送 ping 消息 ,并在 超时间隔内由客户端接收。 建议的值至少是服务器 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout 15 秒 初始服务器握手的超时。 如果服务器在此间隔内未发送握手响应,客户端将取消握手并触发 Closed 事件(onclose 在 JavaScript 中)。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 确定客户端发送 ping 消息的间隔。 从客户端发送任何消息会将计时器重置为间隔的开始。 如果客户端在服务器设定的ClientTimeoutInterval时间内未发送消息,服务器会认为客户端已断开连接。

在 .NET 客户端中,超时值指定为 TimeSpan 值。

配置附加选项

可以在WithUrlwithUrl方法中(在 JavaScript 中为HubConnectionBuilder)或 Java 客户端中的HttpHubConnectionBuilder上的各种配置 API 中配置其他选项。

.NET 选项 默认值 DESCRIPTION
AccessTokenProvider null 一个函数,返回在 HTTP 请求中作为持有者身份验证令牌提供的字符串。
SkipNegotiation false 将此项设置为 true 跳过协商步骤。 仅当 WebSocket 传输是唯一启用的传输时才支持。 使用 Azure SignalR 服务时,无法启用此设置。
ClientCertificates 用于验证请求的 TLS 证书集合。
Cookies 要随每个 HTTP 请求一起发送的 HTTP Cookie 集合。
Credentials 要随每个 HTTP 请求一起发送的凭据。
CloseTimeout 5 秒 仅 WebSocket。 客户端在关闭后等待的最大时间,以便服务器确认关闭请求。 如果服务器在此时间内未确认关闭,客户端会断开连接。
Headers 要随每个 HTTP 请求一起发送的其他 HTTP 标头的映射。
HttpMessageHandlerFactory null 一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler。 不用于 WebSocket 连接。 此委托必须返回非 null 值,并接收默认值作为参数。 修改该默认值的设置并返回,或返回新 HttpMessageHandler 实例。 替换处理程序时,请确保复制要从提供的处理程序中保留的设置,否则,配置的选项(如 Cookie 和标头)将不适用于新处理程序。
Proxy null 发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentials false 设置此布尔值以发送 HTTP 和 WebSocket 请求的默认凭据。 这样就可以使用 Windows 身份验证。
WebSocketConfiguration null 可用于配置其他 WebSocket 选项的委托。 接收可用于配置选项的 ClientWebSocketOptions 实例。

在 .NET 客户端中,这些选项可以通过提供给 WithUrl 的选项委托来修改。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

在 JavaScript 客户端中,可以在提供给以下对象的 withUrlJavaScript 对象中提供这些选项:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

在 Java 客户端中,可以通过 HttpHubConnectionBuilder 返回的 HubConnectionBuilder.create("HUB URL") 上的方法配置这些选项。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

其他资源

JSON/MessagePack 序列化选项

ASP.NET Core SignalR 支持两种编码消息的协议: JSONMessagePack。 各个协议都有可用于序列化的配置选项。

可以在服务器上使用 AddJsonProtocol 扩展方法来配置 JSON 序列化。 可将 AddJsonProtocol 添加到 AddSignalR 中的 Program.cs 之后。 AddJsonProtocol 方法采用接收 options 对象的委托。 该 PayloadSerializerOptions 对象的属性是一个 System.Text.JsonJsonSerializerOptions 对象,可用于配置参数和返回值的序列化。 有关详细信息,请参阅 System.Text.Json 文档

例如,要将序列化程序配置为不更改属性名称的大小写,但又不使用默认的大小写名称,请在 Program.cs 中使用以下代码:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

在 .NET 客户端中,AddJsonProtocol 上有相同的 HubConnectionBuilder 扩展方法。 必须导入Microsoft.Extensions.DependencyInjection命名空间以解析扩展方法。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

注释

目前无法在 JavaScript 客户端中配置 JSON 序列化。

切换到 Newtonsoft.Json

如果需要 Newtonsoft.Json 中不支持的 System.Text.Json 功能,请参阅切换到 Newtonsoft.Json

MessagePack 序列化选项

可以通过向 AddMessagePackProtocol 调用提供委托来配置 MessagePack 序列化。 有关更多详细信息,请参阅 SignalR 中的 MessagePack

注释

目前无法在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 中心的选项:

选项 默认值 DESCRIPTION
ClientTimeoutInterval 30 秒 如果客户端未在此时间间隔内收到消息(包括保持活动状态),则服务器会将其视为已断开连接。 由于实现方式的不同,将客户端标记为断开连接可能需要更长的超时间隔时间。 建议的值是两倍 KeepAliveInterval 的值。
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,则会关闭连接。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 如果服务器在此时间间隔内未发送消息,则会自动发送 ping 消息以保持连接打开状态。 更改 KeepAliveInterval时,更改客户端上的 ServerTimeout 设置或 serverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 如果在 trueHub 方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。
StreamBufferCapacity 10 可以为客户端上传流缓冲的最大项数。 如果达到此限制,将阻止调用的处理,直到服务器处理流项。
MaximumReceiveMessageSize 32 KB 单个传入中心消息的最大大小。 增加此值可能会增加 拒绝服务(DoS)攻击的风险。
MaximumParallelInvocationsPerClient 1 在排队之前,每个客户端可以并行调用的中心方法的最大数量。

可以通过在 AddSignalR 中向 Program.cs 调用提供选项委托,为所有中心配置选项。

builder.Services.AddSignalR(hubOptions =>
{
    hubOptions.EnableDetailedErrors = true;
    hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
});

单个集线器的选项将覆盖AddSignalR提供的全局选项,并且可以使用AddHubOptions进行配置。

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高级 HTTP 配置选项

用于 HttpConnectionDispatcherOptions 配置与传输和内存缓冲区管理相关的高级设置。 通过将委托传递给 MapHub 中的 Program.cs 来配置这些选项。

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

下表介绍了用于配置 ASP.NET Core SignalR的高级 HTTP 选项的选项:

选项 默认值 DESCRIPTION
ApplicationMaxBufferSize 64 KB 在应用反压之前,服务器所缓冲的从客户端接收到的字节的最大数目。 增加此值可使服务器更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
TransportMaxBufferSize 64 KB 服务器在观察到反压之前所缓冲的由应用发送的字节的最大数目。 增加此值可使服务器更快地缓冲较大的消息,而无需等待反压,但会增加内存消耗。
AuthorizationData 从应用于 Hub 类的 Authorize 属性中自动收集的数据。 用于确定客户端是否有权连接到中心的对象列表 IAuthorizeData
Transports 所有传输都已启用。 位标志 HttpTransportType 值的枚举,这些值可限制客户端用于连接的传输。
LongPolling 请参阅下文。 特定于长轮询传输的其他选项。
WebSockets 请参阅下文。 特定于 WebSocket 传输的其他选项。
MinimumProtocolVersion 0 指定协商协议的最低版本。 这用于将客户端限制为较新版本。
CloseOnAuthenticationExpiration 设置此选项可启用身份验证过期跟踪,该跟踪将在令牌过期时关闭连接。

长轮询传输提供可使用 LongPolling 属性配置的其他选项:

选项 默认值 DESCRIPTION
PollTimeout 90 秒 服务器在终止单个轮询请求之前等待消息发送到客户端的最大时间。 降低此值会导致客户端更频繁地发出新的轮询请求。

WebSocket 传输具有可以使用属性 WebSockets 配置的其他选项:

选项 默认值 DESCRIPTION
CloseTimeout 5 秒 服务器关闭后,如果客户端在此时间间隔内未能关闭,连接将终止。
SubProtocolSelector null 一个委托,可用于将 Sec-WebSocket-Protocol 标头设置为自定义值。 委托接收客户端请求的值作为输入,并预期返回所需的值。

配置客户端选项

客户端选项可以在HubConnectionBuilder类型上配置(适用于 .NET 和 JavaScript 客户端)。 它在 Java 客户端中也可用,但 HttpHubConnectionBuilder 子类包含生成器配置选项以及 HubConnection 本身。

配置日志记录

.NET 客户端中的日志记录是使用 ConfigureLogging 方法配置的。 提供程序和筛选器的注册方式与它们在服务器上的注册方式相同。 有关详细信息,请参阅 ASP.NET Core 文档中的日志记录。

注释

若要注册日志记录提供程序,必须安装必要的包。 有关完整列表,请参阅文档的 内置日志记录提供程序 部分。

例如,若要启用控制台日志记录,请安装 Microsoft.Extensions.Logging.Console NuGet 包。 AddConsole调用扩展方法:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

在 JavaScript 客户端中,存在类似的 configureLogging 方法。 提供一个 LogLevel 值,该值指示要生成的日志消息的最小级别。 日志将写入浏览器控制台窗口。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

还可以提供表示日志级别名称的 LogLevel 值,而不是 string 值。 在无权访问SignalR常量的环境中配置LogLevel日志记录时,这非常有用。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

下表列出了可用的日志级别。 提供给configureLogging 的值将设置记录的最低日志级别。 将记录此级别的或表中该级别后面列出的级别的消息。

字符串 LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoinformation LogLevel.Information
warnwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

注释

若要完全禁用日志记录,请在signalR.LogLevel.None方法中指定configureLogging

有关日志记录的详细信息,请参阅 SignalR 诊断文档

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志记录 API,它允许用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段演示如何与 Java 客户端一起使用java.util.loggingSignalR。

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 来限制客户端仅使用指定的传输。 默认情况下,所有传输都处于启用状态。

例如,要禁用“服务器发送的事件”传输,但允许 WebSocket 和长轮询连接,请执行以下操作:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

在 JavaScript 客户端中,通过在传递给 transport 的选项对象上设置 withUrl 字段来配置传输方式。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

在此版本的 Java 客户端中,WebSocket 是唯一可用的传输方式。

在 Java 客户端中,通过withTransport方法在HttpHubConnectionBuilder上选择传输。 Java 客户端默认使用 WebSocket 传输。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

注释

SignalR Java 客户端尚不支持传输回退。

配置持有者身份验证

若要提供身份验证数据以及 SignalR 请求,请使用 AccessTokenProvider 选项(accessTokenFactory 在 JavaScript 中)指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP“持有者身份验证”令牌传入(将 Authorization 标头与类型 Bearer一起使用)。 在 JavaScript 客户端中,访问令牌充当持有者令牌,除了少数浏览器 API 会限制标头应用能力的情况(特别是在“服务器发送的事件”和 WebSocket 请求中)。 在这些情况下,访问令牌以查询字符串值 access_token的形式提供。

在 .NET 客户端中,可以使用 AccessTokenProvider 中的选项委托来指定 WithUrl 选项。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

在 JavaScript 客户端中,通过在以下选项对象accessTokenFactory上设置withUrl字段来配置访问令牌:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

在 Java 客户端中 SignalR ,可以通过向 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 对象本身上,可以配置超时和保持活动行为的其他选项。

选项 默认值 DESCRIPTION
ServerTimeout 30 秒(30,000 毫秒) 服务器活动的超时。 如果服务器在此间隔内未发送消息,客户端会考虑服务器已断开连接并触发 Closed 事件(onclose 在 JavaScript 中)。 此值必须足够大,才能从服务器发送 ping 消息 ,并在 超时间隔内由客户端接收。 建议的值至少是服务器 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout 15 秒 初始服务器握手的超时。 如果服务器在此间隔内未发送握手响应,客户端将取消握手并触发 Closed 事件(onclose 在 JavaScript 中)。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 确定客户端发送 ping 消息的间隔。 从客户端发送任何消息会将计时器重置为间隔的开始。 如果客户端在服务器设定的ClientTimeoutInterval时间内未发送消息,服务器会认为客户端已断开连接。

在 .NET 客户端中,超时值指定为 TimeSpan 值。

配置附加选项

可以在WithUrlwithUrl方法中(在 JavaScript 中为HubConnectionBuilder)或 Java 客户端中的HttpHubConnectionBuilder上的各种配置 API 中配置其他选项。

.NET 选项 默认值 DESCRIPTION
AccessTokenProvider null 一个函数,返回在 HTTP 请求中作为持有者身份验证令牌提供的字符串。
SkipNegotiation false 将此项设置为 true 跳过协商步骤。 仅当 WebSocket 传输是唯一启用的传输时才支持。 使用 Azure SignalR 服务时,无法启用此设置。
ClientCertificates 用于验证请求的 TLS 证书集合。
Cookies 要随每个 HTTP 请求一起发送的 HTTP Cookie 集合。
Credentials 要随每个 HTTP 请求一起发送的凭据。
CloseTimeout 5 秒 仅 WebSocket。 客户端在关闭后等待的最大时间,以便服务器确认关闭请求。 如果服务器在此时间内未确认关闭,客户端会断开连接。
Headers 要随每个 HTTP 请求一起发送的其他 HTTP 标头的映射。
HttpMessageHandlerFactory null 一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler。 不用于 WebSocket 连接。 此委托必须返回非 null 值,并接收默认值作为参数。 修改该默认值的设置并返回,或返回新 HttpMessageHandler 实例。 替换处理程序时,请确保复制要从提供的处理程序中保留的设置,否则,配置的选项(如 Cookie 和标头)将不适用于新处理程序。
Proxy null 发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentials false 设置此布尔值以发送 HTTP 和 WebSocket 请求的默认凭据。 这样就可以使用 Windows 身份验证。
WebSocketConfiguration null 可用于配置其他 WebSocket 选项的委托。 接收可用于配置选项的 ClientWebSocketOptions 实例。
ApplicationMaxBufferSize 1 MB 在应用反压之前,客户端从服务器接收并缓冲的最大字节数。 增加此值可让客户端更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
TransportMaxBufferSize 1 MB 客户端在观察到反压之前所缓冲的由用户应用程序发送的字节的最大数目。 增加此值可让客户端更快地缓冲较大的消息,而无需等待反压,但会增加内存消耗。

在 .NET 客户端中,这些选项可以通过提供给 WithUrl 的选项委托来修改。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

在 JavaScript 客户端中,可以在提供给以下对象的 withUrlJavaScript 对象中提供这些选项:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

在 Java 客户端中,可以通过 HttpHubConnectionBuilder 返回的 HubConnectionBuilder.create("HUB URL") 上的方法配置这些选项。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

其他资源

JSON/MessagePack 序列化选项

ASP.NET Core SignalR 支持两种编码消息的协议: JSONMessagePack。 各个协议都有可用于序列化的配置选项。

可以在服务器上使用 AddJsonProtocol 扩展方法来配置 JSON 序列化。 可将 AddJsonProtocol 添加到 AddSignalR 中的 Startup.ConfigureServices 之后。 AddJsonProtocol 方法采用接收 options 对象的委托。 该 PayloadSerializerOptions 对象的属性是一个 System.Text.JsonJsonSerializerOptions 对象,可用于配置参数和返回值的序列化。 有关详细信息,请参阅 System.Text.Json 文档

例如,要将序列化程序配置为不更改属性名称的大小写,但又不使用默认的大小写名称,请在 Program.cs 中使用以下代码:

builder.Services.AddSignalR()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    });

在 .NET 客户端中,AddJsonProtocol 上有相同的 HubConnectionBuilder 扩展方法。 必须导入Microsoft.Extensions.DependencyInjection命名空间以解析扩展方法。

// At the top of the file:
using Microsoft.Extensions.DependencyInjection;

// When constructing your connection:
var connection = new HubConnectionBuilder()
    .AddJsonProtocol(options => {
        options.PayloadSerializerOptions.PropertyNamingPolicy = null;
    })
    .Build();

注释

目前无法在 JavaScript 客户端中配置 JSON 序列化。

切换到 Newtonsoft.Json

如果需要 Newtonsoft.Json 中不支持的 System.Text.Json 功能,请参阅切换到 Newtonsoft.Json

MessagePack 序列化选项

可以通过向 AddMessagePackProtocol 调用提供委托来配置 MessagePack 序列化。 有关更多详细信息,请参阅 SignalR 中的 MessagePack

注释

目前无法在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 中心的选项:

选项 默认值 DESCRIPTION
ClientTimeoutInterval 30 秒 如果客户端未在此时间间隔内收到消息(包括保持活动状态),则服务器会将其视为已断开连接。 由于实现方式的不同,将客户端标记为断开连接可能需要更长的超时间隔时间。 建议的值是两倍 KeepAliveInterval 的值。
HandshakeTimeout 15 秒 如果客户端在此时间间隔内未发送初始握手消息,则会关闭连接。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 如果服务器在此时间间隔内未发送消息,则会自动发送 ping 消息以保持连接打开状态。 更改 KeepAliveInterval时,更改客户端上的 ServerTimeout 设置或 serverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 如果在 trueHub 方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。
StreamBufferCapacity 10 可以为客户端上传流缓冲的最大项数。 如果达到此限制,将阻止调用的处理,直到服务器处理流项。
MaximumReceiveMessageSize 32 KB 单个传入中心消息的最大大小。 增加此值可能会增加 拒绝服务(DoS)攻击的风险。
MaximumParallelInvocationsPerClient 1 在排队之前,每个客户端可以并行调用的中心方法的最大数量。
DisableImplicitFromServicesParameters false 如果可能,将从 DI 解析中心方法参数。

可以通过在 AddSignalR 中向 Program.cs 调用提供选项委托,为所有中心配置选项。

 builder.Services.AddSignalR(hubOptions =>
 {
     hubOptions.EnableDetailedErrors = true;
     hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
 });

单个集线器的选项将覆盖AddSignalR提供的全局选项,并且可以使用AddHubOptions进行配置。

builder.Services.AddSignalR().AddHubOptions<ChatHub>(options =>
{
    options.EnableDetailedErrors = true;
});

高级 HTTP 配置选项

用于 HttpConnectionDispatcherOptions 配置与传输和内存缓冲区管理相关的高级设置。 通过将委托传递给 MapHub 中的 Program.cs 来配置这些选项。

using Microsoft.AspNetCore.Http.Connections;

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddRazorPages();
builder.Services.AddSignalR();

var app = builder.Build();

if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}

app.UseHttpsRedirection();
app.UseStaticFiles();

app.UseRouting();

app.UseAuthorization();

app.MapRazorPages();
app.MapHub<ChatHub>("/chathub", options =>
{
    options.Transports =
        HttpTransportType.WebSockets |
        HttpTransportType.LongPolling;
}
);
app.Run();

下表介绍了用于配置 ASP.NET Core SignalR的高级 HTTP 选项的选项:

选项 默认值 DESCRIPTION
ApplicationMaxBufferSize 64 KB 在应用反压之前,服务器所缓冲的从客户端接收到的字节的最大数目。 增加此值可使服务器更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
TransportMaxBufferSize 64 KB 服务器在观察到反压之前所缓冲的由应用发送的字节的最大数目。 增加此值可使服务器更快地缓冲较大的消息,而无需等待反压,但会增加内存消耗。
AuthorizationData 从应用于 Hub 类的 Authorize 属性中自动收集的数据。 用于确定客户端是否有权连接到中心的对象列表 IAuthorizeData
Transports 所有传输都已启用。 位标志 HttpTransportType 值的枚举,这些值可限制客户端用于连接的传输。
LongPolling 请参阅下文。 特定于长轮询传输的其他选项。
WebSockets 请参阅下文。 特定于 WebSocket 传输的其他选项。
MinimumProtocolVersion 0 指定协商协议的最低版本。 这用于将客户端限制为较新版本。
CloseOnAuthenticationExpiration 设置此选项可启用身份验证过期跟踪,该跟踪将在令牌过期时关闭连接。

长轮询传输提供可使用 LongPolling 属性配置的其他选项:

选项 默认值 DESCRIPTION
PollTimeout 90 秒 服务器在终止单个轮询请求之前等待消息发送到客户端的最大时间。 降低此值会导致客户端更频繁地发出新的轮询请求。

WebSocket 传输具有可以使用属性 WebSockets 配置的其他选项:

选项 默认值 DESCRIPTION
CloseTimeout 5 秒 服务器关闭后,如果客户端在此时间间隔内未能关闭,连接将终止。
SubProtocolSelector null 一个委托,可用于将 Sec-WebSocket-Protocol 标头设置为自定义值。 委托接收客户端请求的值作为输入,并预期返回所需的值。

配置客户端选项

客户端选项可以在HubConnectionBuilder类型上配置(适用于 .NET 和 JavaScript 客户端)。 它在 Java 客户端中也可用,但 HttpHubConnectionBuilder 子类包含生成器配置选项以及 HubConnection 本身。

配置日志记录

.NET 客户端中的日志记录是使用 ConfigureLogging 方法配置的。 提供程序和筛选器的注册方式与它们在服务器上的注册方式相同。 有关详细信息,请参阅 ASP.NET Core 文档中的日志记录。

注释

若要注册日志记录提供程序,必须安装必要的包。 有关完整列表,请参阅文档的 内置日志记录提供程序 部分。

例如,若要启用控制台日志记录,请安装 Microsoft.Extensions.Logging.Console NuGet 包。 AddConsole调用扩展方法:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub")
    .ConfigureLogging(logging => {
        logging.SetMinimumLevel(LogLevel.Information);
        logging.AddConsole();
    })
    .Build();

在 JavaScript 客户端中,存在类似的 configureLogging 方法。 提供一个 LogLevel 值,该值指示要生成的日志消息的最小级别。 日志将写入浏览器控制台窗口。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging(signalR.LogLevel.Information)
    .build();

还可以提供表示日志级别名称的 LogLevel 值,而不是 string 值。 在无权访问SignalR常量的环境中配置LogLevel日志记录时,这非常有用。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub")
    .configureLogging("warn")
    .build();

下表列出了可用的日志级别。 提供给configureLogging 的值将设置记录的最低日志级别。 将记录此级别的或表中该级别后面列出的级别的消息。

字符串 LogLevel
trace LogLevel.Trace
debug LogLevel.Debug
infoinformation LogLevel.Information
warnwarning LogLevel.Warning
error LogLevel.Error
critical LogLevel.Critical
none LogLevel.None

注释

若要完全禁用日志记录,请在signalR.LogLevel.None方法中指定configureLogging

有关日志记录的详细信息,请参阅 SignalR 诊断文档

SignalR Java 客户端使用 SLF4J 库进行日志记录。 它是一个高级日志记录 API,它允许用户通过引入特定的日志记录依赖项来选择自己的特定日志记录实现。 以下代码片段演示如何与 Java 客户端一起使用java.util.loggingSignalR。

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 来限制客户端仅使用指定的传输。 默认情况下,所有传输都处于启用状态。

例如,要禁用“服务器发送的事件”传输,但允许 WebSocket 和长轮询连接,请执行以下操作:

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", HttpTransportType.WebSockets | HttpTransportType.LongPolling)
    .Build();

在 JavaScript 客户端中,通过在传递给 transport 的选项对象上设置 withUrl 字段来配置传输方式。

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", { transport: signalR.HttpTransportType.WebSockets | signalR.HttpTransportType.LongPolling })
    .build();

在此版本的 Java 客户端中,WebSocket 是唯一可用的传输方式。

在 Java 客户端中,通过withTransport方法在HttpHubConnectionBuilder上选择传输。 Java 客户端默认使用 WebSocket 传输。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
    .withTransport(TransportEnum.WEBSOCKETS)
    .build();

注释

SignalR Java 客户端尚不支持传输回退。

配置持有者身份验证

若要提供身份验证数据以及 SignalR 请求,请使用 AccessTokenProvider 选项(accessTokenFactory 在 JavaScript 中)指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP“持有者身份验证”令牌传入(将 Authorization 标头与类型 Bearer一起使用)。 在 JavaScript 客户端中,访问令牌充当持有者令牌,除了少数浏览器 API 会限制标头应用能力的情况(特别是在“服务器发送的事件”和 WebSocket 请求中)。 在这些情况下,访问令牌以查询字符串值 access_token的形式提供。

在 .NET 客户端中,可以使用 AccessTokenProvider 中的选项委托来指定 WithUrl 选项。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.AccessTokenProvider = async () => {
            // Get and return the access token.
        };
    })
    .Build();

在 JavaScript 客户端中,通过在以下选项对象accessTokenFactory上设置withUrl字段来配置访问令牌:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        accessTokenFactory: () => {
            // Get and return the access token.
            // This function can return a JavaScript Promise if asynchronous
            // logic is required to retrieve the access token.
        }
    })
    .build();

在 Java 客户端中 SignalR ,可以通过向 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 对象本身上,可以配置超时和保持活动行为的其他选项。

选项 默认值 DESCRIPTION
ServerTimeout 30 秒(30,000 毫秒) 服务器活动的超时。 如果服务器在此间隔内未发送消息,客户端会考虑服务器已断开连接并触发 Closed 事件(onclose 在 JavaScript 中)。 此值必须足够大,才能从服务器发送 ping 消息 ,并在 超时间隔内由客户端接收。 建议的值至少是服务器 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout 15 秒 初始服务器握手的超时。 如果服务器在此间隔内未发送握手响应,客户端将取消握手并触发 Closed 事件(onclose 在 JavaScript 中)。 这是一个高级设置,仅当由于严重的网络延迟而发生握手超时错误时,才应对其进行修改。 有关握手过程的更多详细信息,请参阅 SignalR 中心协议规范
KeepAliveInterval 15 秒 确定客户端发送 ping 消息的间隔。 从客户端发送任何消息会将计时器重置为间隔的开始。 如果客户端在服务器设定的ClientTimeoutInterval时间内未发送消息,服务器会认为客户端已断开连接。

在 .NET 客户端中,超时值指定为 TimeSpan 值。

配置附加选项

可以在WithUrlwithUrl方法中(在 JavaScript 中为HubConnectionBuilder)或 Java 客户端中的HttpHubConnectionBuilder上的各种配置 API 中配置其他选项。

.NET 选项 默认值 DESCRIPTION
AccessTokenProvider null 一个函数,返回在 HTTP 请求中作为持有者身份验证令牌提供的字符串。
SkipNegotiation false 将此项设置为 true 跳过协商步骤。 仅当 WebSocket 传输是唯一启用的传输时才支持。 使用 Azure SignalR 服务时,无法启用此设置。
ClientCertificates 用于验证请求的 TLS 证书集合。
Cookies 要随每个 HTTP 请求一起发送的 HTTP Cookie 集合。
Credentials 要随每个 HTTP 请求一起发送的凭据。
CloseTimeout 5 秒 仅 WebSocket。 客户端在关闭后等待的最大时间,以便服务器确认关闭请求。 如果服务器在此时间内未确认关闭,客户端会断开连接。
Headers 要随每个 HTTP 请求一起发送的其他 HTTP 标头的映射。
HttpMessageHandlerFactory null 一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler。 不用于 WebSocket 连接。 此委托必须返回非 null 值,并接收默认值作为参数。 修改该默认值的设置并返回,或返回新 HttpMessageHandler 实例。 替换处理程序时,请确保复制要从提供的处理程序中保留的设置,否则,配置的选项(如 Cookie 和标头)将不适用于新处理程序。
Proxy null 发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentials false 设置此布尔值以发送 HTTP 和 WebSocket 请求的默认凭据。 这样就可以使用 Windows 身份验证。
WebSocketConfiguration null 可用于配置其他 WebSocket 选项的委托。 接收可用于配置选项的 ClientWebSocketOptions 实例。
ApplicationMaxBufferSize 1 MB 在应用反压之前,客户端从服务器接收并缓冲的最大字节数。 增加此值可让客户端更快地接收更大的消息,而无需应用反压,但会增加内存消耗。
TransportMaxBufferSize 1 MB 客户端在观察到反压之前所缓冲的由用户应用程序发送的字节的最大数目。 增加此值可让客户端更快地缓冲较大的消息,而无需等待反压,但会增加内存消耗。

在 .NET 客户端中,这些选项可以通过提供给 WithUrl 的选项委托来修改。

var connection = new HubConnectionBuilder()
    .WithUrl("https://example.com/chathub", options => {
        options.Headers["Foo"] = "Bar";
        options.SkipNegotiation = true;
        options.Transports = HttpTransportType.WebSockets;
        options.Cookies.Add(new Cookie(/* ... */);
        options.ClientCertificates.Add(/* ... */);
    })
    .Build();

在 JavaScript 客户端中,可以在提供给以下对象的 withUrlJavaScript 对象中提供这些选项:

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/chathub", {
        // "Foo: Bar" will not be sent with WebSockets or Server-Sent Events requests
        headers: { "Foo": "Bar" },
        transport: signalR.HttpTransportType.LongPolling 
    })
    .build();

在 Java 客户端中,可以通过 HttpHubConnectionBuilder 返回的 HubConnectionBuilder.create("HUB URL") 上的方法配置这些选项。

HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/chathub")
        .withHeader("Foo", "Bar")
        .shouldSkipNegotiate(true)
        .withHandshakeResponseTimeout(30*1000)
        .build();

其他资源