ASP.NET 核心 SignalR 配置

本文介绍如何为 ASP.NET Core SignalR 配置客户端和服务器选项。

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

配置编码消息的序列化

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

JSON 序列化选项

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

例如,若要将序列化器配置为不更改属性名称的大小写,而不是使用默认的 camel case 属性名称,请在 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 的值时,请在客户端上更改 ServerTimeoutserverTimeoutInMilliseconds 设置。 建议的 ServerTimeoutserverTimeoutInMilliseconds 值是 KeepAliveInterval 值的两倍。
SupportedProtocols 所有已安装的协议 此中心支持的协议。 默认情况下,允许在服务器上注册的所有协议。 可以从此列表中删除协议,以禁用各个中心的特定协议。
EnableDetailedErrors false 启用此选项时(true当在中心方法中引发异常时,详细异常消息将返回到客户端。 默认值是 false 因为这些异常消息可以包含敏感信息。
StreamBufferCapacity 10 可以为客户端上传流缓冲的最大项数。 达到此限制后,将阻止调用的处理,直到服务器处理流项。
MaximumReceiveMessageSize 32 KB 单个传入的 Hub 消息的最大大小。 增加此值可能会增加 拒绝服务(DoS)攻击的风险。
MaximumParallelInvocationsPerClient 1 在排队之前,每个客户端可以并行调用的中心方法的最大数量。 请注意,此限制不适用于流式处理中心调用。 有关详细信息,请参阅 ASP.NET Core SignalR中的使用中心。
DisableImplicitFromServicesParameters false Hub 方法参数如果可能,会通过依赖注入来解析。

可以通过在 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 选项的选项:

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

配置长轮询传输

长轮询传输还有其他选项,可通过 LongPolling 属性进行配置:

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

配置 WebSocket 传输

WebSocket 传输还有其他可通过 WebSockets 属性配置的选项:

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

配置客户端选项

在.NET客户端和 JavaScript 客户端中,客户端选项在 HubConnectionBuilder 类型上配置。 在 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

有关日志记录的详细信息,请参阅ASP.NET Core 中的日志记录和诊断SignalR

SignalR Java 客户端使用 Simple Logging Facade for 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“Bearer 身份验证”令牌的形式传递(使用 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();

在 SignalR Java 客户端中,您可以通过向 HttpHubConnectionBuilder 提供访问令牌提供程序,来配置用于身份验证的持有者令牌。 使用 withAccessTokenProvider 提供一个 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 字节。

配置其他选项

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

选项 默认值 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。 此委托必须返回非 null 值,并接收默认值作为参数。 可以修改该默认值的设置并返回它,也可以返回新 HttpMessageHandler 实例。

注意
- 替换处理程序时,请务必复制要从提供的处理程序中保留的设置。 否则,配置的选项(如 Cookie 和标头)不适用于新处理程序。
- 此设置不用于 WebSocket 连接。
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();

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 在排队之前,每个客户端可以并行调用的中心方法的最大数量。

注释

MaximumParallelInvocationsPerClient 不适用于流式处理中心调用。 流式调用通常是长时间运行的,并且可以并发执行。 使用 中心筛选器 强制执行每个连接的流式并发限制。

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

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

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

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

高级 HTTP 配置选项

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

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

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

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

选项 默认值 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 在排队之前,每个客户端可以并行调用的中心方法的最大数量。

注释

MaximumParallelInvocationsPerClient 不适用于流式处理中心调用。 流式调用预计会长时间运行,并且可以并发执行。 使用 Hub 筛选器 强制执行每个连接的流并发限制。

可以通过在 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 false 设置此选项可启用身份验证过期跟踪,该跟踪将在令牌过期时关闭连接。

长轮询传输提供可使用 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 false 设置此选项可启用身份验证过期跟踪,该跟踪将在令牌过期时关闭连接。

长轮询传输提供可使用 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();

其他资源