ASP.NET Core SignalR 配置

JSON/MessagePack 序列化选项

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

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

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

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

在 .NET 客户端中, HubConnectionBuilder上存在相同的 AddJsonProtocol 扩展方法。 必须导入 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

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

MessagePack 序列化选项

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

备注

目前不能在 JavaScript 客户端中配置 MessagePack 序列化。

配置服务器选项

下表描述了用于配置 SignalR 集线器的选项:

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

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

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

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

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

高级 HTTP 配置选项

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

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

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

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

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

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

选项 默认值 描述
PollTimeout 90秒 服务器在终止单个轮询请求之前等待发送到客户端的消息的最长时间。 减小此值将导致客户端更频繁地发出新的投票请求。

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

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

配置客户端选项

可以在 HubConnectionBuilder 类型上配置客户端选项(在 .NET 和 JavaScript 客户端中提供)。 Java 客户端中也提供了此功能,但 HttpHubConnectionBuilder 子类包含生成器配置选项,以及 HubConnection 本身。

配置日志记录

使用 ConfigureLogging 方法在 .NET 客户端中配置日志记录。 日志提供程序和筛选器的注册方式与服务器上相同。 请参阅登录 ASP.NET Core 文档以了解更多信息。

备注

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

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

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

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

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

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

let connection = new signalR.HubConnectionBuilder()
    .withUrl("/myhub")
    .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

备注

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

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

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

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 的值的按位 "或" 可用于将客户端限制为仅使用指定的传输。 默认情况下,将启用所有传输。

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

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

在 JavaScript 客户端中,通过在提供给 withUrl的 options 对象上设置 transport 字段来配置传输:

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

此版本的 Java 客户端 websocket 是唯一可用的传输。

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

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

备注

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

配置持有者身份验证

若要将身份验证数据与 SignalR 请求一起提供,请使用 AccessTokenProvider 选项(在 JavaScript 中为accessTokenFactory)来指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP "持有者身份验证" 令牌传入(使用 Bearer类型的 Authorization 标头)。 在 JavaScript 客户端中,访问令牌用作持有者令牌,在某些情况下,浏览器 api 限制应用标头的能力(具体而言,在服务器发送事件和 websocket 请求中)。 在这些情况下,访问令牌作为查询字符串值提供 access_token

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

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

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

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

在 SignalR Java 客户端中,可以通过向HttpHubConnectionBuilder提供访问令牌工厂来配置用于身份验证的持有者令牌。 使用withAccessTokenFactory提供RxJava 单一<字符串 > 如果调用了单延迟,你可以编写逻辑来为客户端生成访问令牌。

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

配置超时和 keep-alive 选项

用于配置超时和保持活动状态的其他选项在 HubConnection 对象本身上可用:

配置其他选项

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

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

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

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

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

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

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

其他资源

JSON/MessagePack 序列化选项

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

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

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

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

在 .NET 客户端中, HubConnectionBuilder上存在相同的 AddJsonProtocol 扩展方法。 必须导入 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 集线器的选项:

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

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

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

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

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

高级 HTTP 配置选项

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

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

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

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

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

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

选项 默认值 描述
PollTimeout 90秒 服务器在终止单个轮询请求之前等待发送到客户端的消息的最长时间。 减小此值将导致客户端更频繁地发出新的投票请求。

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

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

配置客户端选项

可以在 HubConnectionBuilder 类型上配置客户端选项(在 .NET 和 JavaScript 客户端中提供)。 Java 客户端中也提供了此功能,但 HttpHubConnectionBuilder 子类包含生成器配置选项,以及 HubConnection 本身。

配置日志记录

使用 ConfigureLogging 方法在 .NET 客户端中配置日志记录。 日志提供程序和筛选器的注册方式与服务器上相同。 请参阅登录 ASP.NET Core 文档以了解更多信息。

备注

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

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

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

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

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

备注

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

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

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

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 的值的按位 "或" 可用于将客户端限制为仅使用指定的传输。 默认情况下,将启用所有传输。

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

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

在 JavaScript 客户端中,通过在提供给 withUrl的 options 对象上设置 transport 字段来配置传输:

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

此版本的 Java 客户端 websocket 是唯一可用的传输。

配置持有者身份验证

若要将身份验证数据与 SignalR 请求一起提供,请使用 AccessTokenProvider 选项(在 JavaScript 中为accessTokenFactory)来指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP "持有者身份验证" 令牌传入(使用 Bearer类型的 Authorization 标头)。 在 JavaScript 客户端中,访问令牌用作持有者令牌,在某些情况下,浏览器 api 限制应用标头的能力(具体而言,在服务器发送事件和 websocket 请求中)。 在这些情况下,访问令牌作为查询字符串值提供 access_token

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

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

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

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

在 SignalR Java 客户端中,可以通过向HttpHubConnectionBuilder提供访问令牌工厂来配置用于身份验证的持有者令牌。 使用withAccessTokenFactory提供RxJava 单一<字符串 > 如果调用了单延迟,你可以编写逻辑来为客户端生成访问令牌。

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

配置超时和 keep-alive 选项

用于配置超时和保持活动状态的其他选项在 HubConnection 对象本身上可用:

配置其他选项

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

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

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

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

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

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

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

其他资源

JSON/MessagePack 序列化选项

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

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

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

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

在 .NET 客户端中, HubConnectionBuilder上存在相同的 AddJsonProtocol 扩展方法。 必须导入 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 集线器的选项:

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

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

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

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

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

高级 HTTP 配置选项

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

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

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

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

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

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

选项 默认值 描述
PollTimeout 90秒 服务器在终止单个轮询请求之前等待发送到客户端的消息的最长时间。 减小此值将导致客户端更频繁地发出新的投票请求。

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

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

配置客户端选项

可以在 HubConnectionBuilder 类型上配置客户端选项(在 .NET 和 JavaScript 客户端中提供)。 Java 客户端中也提供了此功能,但 HttpHubConnectionBuilder 子类包含生成器配置选项,以及 HubConnection 本身。

配置日志记录

使用 ConfigureLogging 方法在 .NET 客户端中配置日志记录。 日志提供程序和筛选器的注册方式与服务器上相同。 请参阅登录 ASP.NET Core 文档以了解更多信息。

备注

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

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

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

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

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

备注

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

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

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

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 的值的按位 "或" 可用于将客户端限制为仅使用指定的传输。 默认情况下,将启用所有传输。

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

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

在 JavaScript 客户端中,通过在提供给 withUrl的 options 对象上设置 transport 字段来配置传输:

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

配置持有者身份验证

若要将身份验证数据与 SignalR 请求一起提供,请使用 AccessTokenProvider 选项(在 JavaScript 中为accessTokenFactory)来指定返回所需访问令牌的函数。 在 .NET 客户端中,此访问令牌作为 HTTP "持有者身份验证" 令牌传入(使用 Bearer类型的 Authorization 标头)。 在 JavaScript 客户端中,访问令牌用作持有者令牌,在某些情况下,浏览器 api 限制应用标头的能力(具体而言,在服务器发送事件和 websocket 请求中)。 在这些情况下,访问令牌作为查询字符串值提供 access_token

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

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

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

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

在 SignalR Java 客户端中,可以通过向HttpHubConnectionBuilder提供访问令牌工厂来配置用于身份验证的持有者令牌。 使用withAccessTokenFactory提供RxJava 单一<字符串 > 如果调用了单延迟,你可以编写逻辑来为客户端生成访问令牌。

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

配置超时和 keep-alive 选项

用于配置超时和保持活动状态的其他选项在 HubConnection 对象本身上可用:

配置其他选项

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

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

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

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

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

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

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

其他资源

上一篇:在后台服务中宿主 ASP.NET Core SignalR

下一篇:ASP.NET Core 中的身份验证和授权 SignalR

关注微信小程序
程序员编程王-随时随地学编程

扫描二维码
程序员编程王

扫一扫关注最新编程教程