ASP.NET Core SignalR 配置ASP.NET Core SignalR configuration

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

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

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

  1. // At the top of the file:
  2. using Microsoft.Extensions.DependencyInjection;
  3. // When constructing your connection:
  4. var connection = new HubConnectionBuilder()
  5. .AddJsonProtocol(options => {
  6. options.PayloadSerializerOptions.PropertyNamingPolicy = null;
  7. })
  8. .Build();

备注

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

切换到 Newtonsoft.jsonSwitch to Newtonsoft.Json

如果需要 System.Text.Json不支持的 Newtonsoft.Json 功能,请参阅。

MessagePack 序列化选项MessagePack serialization options

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

备注

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

配置服务器选项Configure server options

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

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddSignalR(hubOptions =>
  4. {
  5. hubOptions.EnableDetailedErrors = true;
  6. hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
  7. });
  8. }

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

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

高级 HTTP 配置选项Advanced HTTP configuration options

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

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. app.UseRouting();
  4. app.UseEndpoints(endpoints =>
  5. {
  6. endpoints.MapHub<MyHub>("/myhub", options =>
  7. {
  8. options.Transports =
  9. HttpTransportType.WebSockets |
  10. HttpTransportType.LongPolling;
  11. });
  12. });
  13. }

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

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

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

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

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

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

配置客户端选项Configure client options

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

配置日志记录Configure logging

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

备注

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

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

  1. var connection = new HubConnectionBuilder()
  2. .WithUrl("https://example.com/myhub")
  3. .ConfigureLogging(logging => {
  4. logging.SetMinimumLevel(LogLevel.Information);
  5. logging.AddConsole();
  6. })
  7. .Build();

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

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

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

  1. let connection = new signalR.HubConnectionBuilder()
  2. .withUrl("/myhub")
  3. .configureLogging("warn")
  4. .build();

下表列出了可用的日志级别。你为 configureLogging 提供的值设置将记录的最小日志级别。将记录在此级别上记录的消息或在表中列出的级别

StringLogLevel
traceLogLevel.Trace
debugLogLevel.Debug
infoinformationLogLevel.Information
warnwarningLogLevel.Warning
errorLogLevel.Error
criticalLogLevel.Critical
noneLogLevel.None

备注

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

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

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

  1. implementation 'org.slf4j:slf4j-jdk14:1.7.25'

如果未在依赖项中配置日志记录,SLF4J 将加载默认的非操作记录器,并提供以下警告消息:

  1. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
  2. SLF4J: Defaulting to no-operation (NOP) logger implementation
  3. SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

可以安全地忽略此情况。

配置允许的传输Configure allowed transports

可以在 WithUrl 调用(JavaScript 中的withUrl)中配置 SignalR 使用的传输。HttpTransportType 的值的按位 "或" 可用于将客户端限制为仅使用指定的传输。默认情况下,将启用所有传输。

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

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

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

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

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

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

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

备注

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

配置持有者身份验证Configure bearer authentication

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

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

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

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

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

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

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

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

选项默认值说明
ServerTimeout30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 Closed 事件(JavaScript 中的onclose)。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout15 秒初始服务器握手的超时时间。如果服务器在此时间间隔内未发送握手响应,则客户端将取消握手,并触发 Closed 事件(JavaScript 中的onclose)。这是一种高级设置,只应在握手超时错误由于严重网络延迟而发生时进行修改。有关握手过程的详细信息,请参阅SignalR Hub 协议规范
KeepAliveInterval15 秒确定客户端发送 ping 消息的间隔。如果从客户端发送任何消息,则会将计时器重置为间隔的开始时间。如果客户端未在服务器上设置的 ClientTimeoutInterval 中发送消息,则服务器会将客户端视为已断开连接。
选项默认值说明
serverTimeoutInMilliseconds30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 onclose 事件。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
keepAliveIntervalInMilliseconds15秒(15000毫秒)确定客户端发送 ping 消息的间隔。如果从客户端发送任何消息,则会将计时器重置为间隔的开始时间。如果客户端未在服务器上设置的 ClientTimeoutInterval 中发送消息,则服务器会将客户端视为已断开连接。
选项默认值说明
getServerTimeout / setServerTimeout30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 onClose 事件。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
withHandshakeResponseTimeout15 秒初始服务器握手的超时时间。如果服务器在此时间间隔内未发送握手响应,则客户端将取消握手,并触发 onClose 事件。这是一种高级设置,只应在握手超时错误由于严重网络延迟而发生时进行修改。有关握手过程的详细信息,请参阅。
getKeepAliveInterval / setKeepAliveInterval15秒(15000毫秒)确定客户端发送 ping 消息的间隔。如果从客户端发送任何消息,则会将计时器重置为间隔的开始时间。如果客户端未在服务器上设置的 ClientTimeoutInterval 中发送消息,则服务器会将客户端视为已断开连接。

配置其他选项Configure additional options

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

.NET 选项默认值说明
AccessTokenProvidernull一个函数,它返回作为 HTTP 请求中的持有者身份验证令牌提供的字符串。
SkipNegotiationfalse将此设置为 "true" 以跳过协商步骤。仅当 websocket 传输为唯一启用的传输时才受支持使用 Azure SignalR 服务时无法启用此设置。
ClientCertificates要发送以对请求进行身份验证的 TLS 证书的集合。
Cookies要随每个 HTTP 请求一起发送的 HTTP cookie 的集合。
Credentials要随每个 HTTP 请求一起发送的凭据。
CloseTimeout5 秒仅 Websocket。客户端在关闭之后等待服务器确认关闭请求的最长时间。如果服务器在这段时间内没有确认关闭,客户端将断开连接。
Headers要随每个 HTTP 请求一起发送的附加 HTTP 标头的映射。
HttpMessageHandlerFactorynull一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler不用于 WebSocket 连接。此委托必须返回非 null 值,并接收默认值作为参数。修改该默认值的设置并将其返回,或返回一个新的 HttpMessageHandler 实例。当替换处理程序时,请确保从提供的处理程序复制您要保留的设置,否则,配置的选项(如 Cookie 和标头)将不会应用于新的处理程序。
Proxynull发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentialsfalse设置此布尔值可发送 HTTP 和 Websocket 请求的默认凭据。这样就可以使用 Windows 身份验证。
WebSocketConfigurationnull可用于配置其他 WebSocket 选项的委托。接收可用于配置选项的ClientWebSocketOptions实例。
JavaScript 选项默认值说明
accessTokenFactorynull一个函数,它返回作为 HTTP 请求中的持有者身份验证令牌提供的字符串。
skipNegotiationfalse将此设置为 "true" 以跳过协商步骤。仅当 websocket 传输为唯一启用的传输时才受支持使用 Azure SignalR 服务时无法启用此设置。

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

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

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

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

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

其他资源Additional resources

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

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

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

  1. services.AddSignalR()
  2. .AddJsonProtocol(options => {
  3. options.PayloadSerializerSettings.ContractResolver =
  4. new DefaultContractResolver();
  5. });

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

  1. // At the top of the file:
  2. using Microsoft.Extensions.DependencyInjection;
  3. // When constructing your connection:
  4. var connection = new HubConnectionBuilder()
  5. .AddJsonProtocol(options => {
  6. options.PayloadSerializerSettings.ContractResolver =
  7. new DefaultContractResolver();
  8. })
  9. .Build();

备注

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

MessagePack 序列化选项MessagePack serialization options

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

备注

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

配置服务器选项Configure server options

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

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

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddSignalR(hubOptions =>
  4. {
  5. hubOptions.EnableDetailedErrors = true;
  6. hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
  7. });
  8. }

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

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

高级 HTTP 配置选项Advanced HTTP configuration options

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

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. app.UseSignalR((configure) =>
  4. {
  5. var desiredTransports =
  6. HttpTransportType.WebSockets |
  7. HttpTransportType.LongPolling;
  8. configure.MapHub<MyHub>("/myhub", (options) =>
  9. {
  10. options.Transports = desiredTransports;
  11. });
  12. });
  13. }

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

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

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

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

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

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

配置客户端选项Configure client options

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

配置日志记录Configure logging

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

备注

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

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

  1. var connection = new HubConnectionBuilder()
  2. .WithUrl("https://example.com/myhub")
  3. .ConfigureLogging(logging => {
  4. logging.SetMinimumLevel(LogLevel.Information);
  5. logging.AddConsole();
  6. })
  7. .Build();

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

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

备注

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

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

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

  1. implementation 'org.slf4j:slf4j-jdk14:1.7.25'

如果未在依赖项中配置日志记录,SLF4J 将加载默认的非操作记录器,并提供以下警告消息:

  1. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
  2. SLF4J: Defaulting to no-operation (NOP) logger implementation
  3. SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

可以安全地忽略此情况。

配置允许的传输Configure allowed transports

可以在 WithUrl 调用(JavaScript 中的withUrl)中配置 SignalR 使用的传输。HttpTransportType 的值的按位 "或" 可用于将客户端限制为仅使用指定的传输。默认情况下,将启用所有传输。

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

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

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

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

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

配置持有者身份验证Configure bearer authentication

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

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

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

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

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

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

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

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

选项默认值说明
ServerTimeout30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 Closed 事件(JavaScript 中的onclose)。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout15 秒初始服务器握手的超时时间。如果服务器在此时间间隔内未发送握手响应,则客户端将取消握手,并触发 Closed 事件(JavaScript 中的onclose)。这是一种高级设置,只应在握手超时错误由于严重网络延迟而发生时进行修改。有关握手过程的详细信息,请参阅SignalR Hub 协议规范
KeepAliveInterval15 秒确定客户端发送 ping 消息的间隔。如果从客户端发送任何消息,则会将计时器重置为间隔的开始时间。如果客户端未在服务器上设置的 ClientTimeoutInterval 中发送消息,则服务器会将客户端视为已断开连接。

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

选项默认值说明
serverTimeoutInMilliseconds30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 onclose 事件。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
keepAliveIntervalInMilliseconds15秒(15000毫秒)确定客户端发送 ping 消息的间隔。如果从客户端发送任何消息,则会将计时器重置为间隔的开始时间。如果客户端未在服务器上设置的 ClientTimeoutInterval 中发送消息,则服务器会将客户端视为已断开连接。
选项默认值说明
getServerTimeout / setServerTimeout30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 onClose 事件。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
withHandshakeResponseTimeout15 秒初始服务器握手的超时时间。如果服务器在此时间间隔内未发送握手响应,则客户端将取消握手,并触发 onClose 事件。这是一种高级设置,只应在握手超时错误由于严重网络延迟而发生时进行修改。有关握手过程的详细信息,请参阅。
getKeepAliveInterval / setKeepAliveInterval15秒(15000毫秒)确定客户端发送 ping 消息的间隔。如果从客户端发送任何消息,则会将计时器重置为间隔的开始时间。如果客户端未在服务器上设置的 ClientTimeoutInterval 中发送消息,则服务器会将客户端视为已断开连接。

配置其他选项Configure additional options

.NET 选项默认值说明
AccessTokenProvidernull一个函数,它返回作为 HTTP 请求中的持有者身份验证令牌提供的字符串。
SkipNegotiationfalse将此设置为 "true" 以跳过协商步骤。仅当 websocket 传输为唯一启用的传输时才受支持使用 Azure SignalR 服务时无法启用此设置。
ClientCertificates要发送以对请求进行身份验证的 TLS 证书的集合。
Cookies要随每个 HTTP 请求一起发送的 HTTP cookie 的集合。
Credentials要随每个 HTTP 请求一起发送的凭据。
CloseTimeout5 秒仅 Websocket。客户端在关闭之后等待服务器确认关闭请求的最长时间。如果服务器在这段时间内没有确认关闭,客户端将断开连接。
Headers要随每个 HTTP 请求一起发送的附加 HTTP 标头的映射。
HttpMessageHandlerFactorynull一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler不用于 WebSocket 连接。此委托必须返回非 null 值,并接收默认值作为参数。修改该默认值的设置并将其返回,或返回一个新的 HttpMessageHandler 实例。当替换处理程序时,请确保从提供的处理程序复制您要保留的设置,否则,配置的选项(如 Cookie 和标头)将不会应用于新的处理程序。
Proxynull发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentialsfalse设置此布尔值可发送 HTTP 和 Websocket 请求的默认凭据。这样就可以使用 Windows 身份验证。
WebSocketConfigurationnull可用于配置其他 WebSocket 选项的委托。接收可用于配置选项的ClientWebSocketOptions实例。
JavaScript 选项默认值说明
accessTokenFactorynull一个函数,它返回作为 HTTP 请求中的持有者身份验证令牌提供的字符串。
skipNegotiationfalse将此设置为 "true" 以跳过协商步骤。仅当 websocket 传输为唯一启用的传输时才受支持使用 Azure SignalR 服务时无法启用此设置。

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

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

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

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

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

其他资源Additional resources

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

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

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

  1. services.AddSignalR()
  2. .AddJsonProtocol(options => {
  3. options.PayloadSerializerSettings.ContractResolver =
  4. new DefaultContractResolver();
  5. });

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

  1. // At the top of the file:
  2. using Microsoft.Extensions.DependencyInjection;
  3. // When constructing your connection:
  4. var connection = new HubConnectionBuilder()
  5. .AddJsonProtocol(options => {
  6. options.PayloadSerializerSettings.ContractResolver =
  7. new DefaultContractResolver();
  8. })
  9. .Build();

备注

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

MessagePack 序列化选项MessagePack serialization options

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

备注

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

配置服务器选项Configure server options

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

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

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

  1. public void ConfigureServices(IServiceCollection services)
  2. {
  3. services.AddSignalR(hubOptions =>
  4. {
  5. hubOptions.EnableDetailedErrors = true;
  6. hubOptions.KeepAliveInterval = TimeSpan.FromMinutes(1);
  7. });
  8. }

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

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

高级 HTTP 配置选项Advanced HTTP configuration options

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

  1. public void Configure(IApplicationBuilder app, IHostingEnvironment env)
  2. {
  3. app.UseSignalR((configure) =>
  4. {
  5. var desiredTransports =
  6. HttpTransportType.WebSockets |
  7. HttpTransportType.LongPolling;
  8. configure.MapHub<MyHub>("/myhub", (options) =>
  9. {
  10. options.Transports = desiredTransports;
  11. });
  12. });
  13. }

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

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

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

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

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

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

配置客户端选项Configure client options

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

配置日志记录Configure logging

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

备注

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

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

  1. var connection = new HubConnectionBuilder()
  2. .WithUrl("https://example.com/myhub")
  3. .ConfigureLogging(logging => {
  4. logging.SetMinimumLevel(LogLevel.Information);
  5. logging.AddConsole();
  6. })
  7. .Build();

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

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

备注

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

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

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

  1. implementation 'org.slf4j:slf4j-jdk14:1.7.25'

如果未在依赖项中配置日志记录,SLF4J 将加载默认的非操作记录器,并提供以下警告消息:

  1. SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder".
  2. SLF4J: Defaulting to no-operation (NOP) logger implementation
  3. SLF4J: See http://www.slf4j.org/codes.html#StaticLoggerBinder for further details.

可以安全地忽略此情况。

配置允许的传输Configure allowed transports

可以在 WithUrl 调用(JavaScript 中的withUrl)中配置 SignalR 使用的传输。HttpTransportType 的值的按位 "或" 可用于将客户端限制为仅使用指定的传输。默认情况下,将启用所有传输。

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

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

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

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

配置持有者身份验证Configure bearer authentication

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

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

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

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

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

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

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

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

选项默认值说明
ServerTimeout30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 Closed 事件(JavaScript 中的onclose)。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
HandshakeTimeout15 秒初始服务器握手的超时时间。如果服务器在此时间间隔内未发送握手响应,则客户端将取消握手,并触发 Closed 事件(JavaScript 中的onclose)。这是一种高级设置,只应在握手超时错误由于严重网络延迟而发生时进行修改。有关握手过程的详细信息,请参阅SignalR Hub 协议规范

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

选项默认值说明
serverTimeoutInMilliseconds30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 onclose 事件。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
选项默认值说明
getServerTimeout / setServerTimeout30秒(30000毫秒)服务器活动超时。如果服务器未在此时间间隔内发送消息,则客户端会将服务器视为断开连接,并触发 onClose 事件。此值必须足够大,以便从服务器发送 ping 消息 ,并在超时间隔内由客户端接收该消息。建议值至少为服务器的 KeepAliveInterval 值的两倍,以允许 ping 到达的时间。
withHandshakeResponseTimeout15 秒初始服务器握手的超时时间。如果服务器在此时间间隔内未发送握手响应,则客户端将取消握手,并触发 onClose 事件。这是一种高级设置,只应在握手超时错误由于严重网络延迟而发生时进行修改。有关握手过程的详细信息,请参阅。

配置其他选项Configure additional options

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

.NET 选项默认值说明
AccessTokenProvidernull一个函数,它返回作为 HTTP 请求中的持有者身份验证令牌提供的字符串。
SkipNegotiationfalse将此设置为 "true" 以跳过协商步骤。仅当 websocket 传输为唯一启用的传输时才受支持使用 Azure SignalR 服务时无法启用此设置。
ClientCertificates要发送以对请求进行身份验证的 TLS 证书的集合。
Cookies要随每个 HTTP 请求一起发送的 HTTP cookie 的集合。
Credentials要随每个 HTTP 请求一起发送的凭据。
CloseTimeout5 秒仅 Websocket。客户端在关闭之后等待服务器确认关闭请求的最长时间。如果服务器在这段时间内没有确认关闭,客户端将断开连接。
Headers要随每个 HTTP 请求一起发送的附加 HTTP 标头的映射。
HttpMessageHandlerFactorynull一个委托,可用于配置或替换用于发送 HTTP 请求的 HttpMessageHandler不用于 WebSocket 连接。此委托必须返回非 null 值,并接收默认值作为参数。修改该默认值的设置并将其返回,或返回一个新的 HttpMessageHandler 实例。当替换处理程序时,请确保从提供的处理程序复制您要保留的设置,否则,配置的选项(如 Cookie 和标头)将不会应用于新的处理程序。
Proxynull发送 HTTP 请求时要使用的 HTTP 代理。
UseDefaultCredentialsfalse设置此布尔值可发送 HTTP 和 Websocket 请求的默认凭据。这样就可以使用 Windows 身份验证。
WebSocketConfigurationnull可用于配置其他 WebSocket 选项的委托。接收可用于配置选项的ClientWebSocketOptions实例。
JavaScript 选项默认值说明
accessTokenFactorynull一个函数,它返回作为 HTTP 请求中的持有者身份验证令牌提供的字符串。
skipNegotiationfalse将此设置为 "true" 以跳过协商步骤。仅当 websocket 传输为唯一启用的传输时才受支持使用 Azure SignalR 服务时无法启用此设置。

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

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

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

  1. HubConnection hubConnection = HubConnectionBuilder.create("https://example.com/myhub")
  2. .withHeader("Foo", "Bar")
  3. .shouldSkipNegotiate(true)
  4. .build();

其他资源Additional resources