You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor SignalR/电路超时深度解析与配置问题咨询

Blazor Server Timeout & Circuit Configuration Answers

Let's break down each of your questions with clear explanations and practical examples—navigating these settings can feel overwhelming at first, so I'll keep it straightforward.


问题1:客户端与服务器端超时配置、JS vs Program.cs区别及官方文档

First, let's split this into server-side and client-side configurations:

服务器端(核心超时/保活配置)

You set these in Program.cs using AddServerSideBlazor() with two key extension methods:

  • Hub-level settings (via AddHubOptions):
    • ClientTimeoutInterval: How long the server waits for a message from the client before considering the connection lost (default: 30 seconds)
    • KeepAliveInterval: How often the server sends keep-alive messages to the client (default: 15 seconds)
    • HandshakeTimeout: How long the server waits for the client to complete the initial handshake (default: 10 seconds)
  • Circuit-level settings (via AddCircuitOptions):
    • DisconnectTimeout: How long the server keeps a circuit alive after the connection drops before closing it (default: 3 minutes/180 seconds)

Example code:

services.AddServerSideBlazor()
    .AddHubOptions(options =>
    {
        options.ClientTimeoutInterval = TimeSpan.FromMinutes(10);
        options.KeepAliveInterval = TimeSpan.FromSeconds(30);
        options.HandshakeTimeout = TimeSpan.FromMinutes(2);
    })
    .AddCircuitOptions(options =>
    {
        options.DisconnectTimeout = TimeSpan.FromMinutes(5);
    });

客户端(超时/保活配置)

These are configured via JavaScript (you can't set them via C# at startup, since they run in the browser). Modify the Blazor SignalR connection setup in your _Host.cshtml:

Example JS configuration:

<script src="_framework/blazor.server.js" autostart="false"></script>
<script>
    Blazor.start({
        configureSignalR: function (builder) {
            builder.withUrl("/_blazor", {
                timeout: 30000, // Client-side timeout waiting for server responses
                keepAliveInterval: 15000 // Client-side interval to send keep-alive
            });
        }
    });
</script>

Key Differences:

  • Program.cs settings: Control server-side behavior (how the server manages connections/circuits, when it considers a client lost)
  • JS settings: Control client-side behavior (how the browser waits for server responses, when it sends keep-alives, how it handles reconnection attempts)

Official Docs Location:

Look for sections on Blazor Server Connection Management and SignalR Hub Configuration in the ASP.NET Core documentation—these cover all settings and their interactions in detail.


问题2:查看服务器端超时参数及180秒断开超时设置

查看 Server-Side Timeout Parameters:

  • Inspect configured values by injecting IOptions<HubOptions> and IOptions<CircuitOptions> into a component or service:
    @inject IOptions<HubOptions> HubOptions
    @inject IOptions<CircuitOptions> CircuitOptions
    
    <p>Client Timeout: @HubOptions.Value.ClientTimeoutInterval</p>
    <p>Disconnect Timeout: @CircuitOptions.Value.DisconnectTimeout</p>
    
  • Alternatively, log these values during startup in Program.cs to verify your configuration.

The 180-Second Disconnect Timeout:

That's the default DisconnectTimeout from CircuitOptions, not ClientTimeoutInterval or WebSockets.CloseTimeout. To modify it:

services.AddServerSideBlazor()
    .AddCircuitOptions(options =>
    {
        options.DisconnectTimeout = TimeSpan.FromMinutes(5); // Adjust to your needs
    });

This controls how long the server holds onto a circuit after the connection drops—if the client reconnects within this window, it can resume the existing circuit.


问题3:文档中提到的5秒超时是什么?

That 5-second timeout refers to WebSocketOptions.CloseTimeout. It's a transport-level setting, not a circuit shutdown timeout:

  • When the server initiates a WebSocket connection close, it waits 5 seconds for the client to acknowledge the close request.
  • If the client doesn't respond within 5 seconds, the server force-closes the WebSocket connection.
  • This has nothing to do with how long the server keeps the circuit alive (that's DisconnectTimeout).

问题4:AddHubOptions vs MapBlazorHub配置区别

Let's clarify the two layers of configuration:

  1. AddHubOptions:

    • Applies globally to all SignalR Hubs in your application (including Blazor's internal _blazor hub)
    • Controls hub-level behavior: client timeout intervals, keep-alive messages, handshake timeouts, etc.
    • These settings relate to the SignalR protocol and hub logic, not the underlying transport (WebSocket, Long Polling)
  2. MapBlazorHub:

    • Applies only to Blazor Server's specific _blazor hub
    • Controls transport-level settings for the connection:
      • WebSockets.CloseTimeout: The wait time for WebSocket close acknowledgment
      • LongPolling.PollTimeout: How long the server holds a long-polling request open before sending an empty response
    • These are low-level settings tied to how the connection is transmitted over the network

Example of combining both for full control:

// Program.cs
services.AddServerSideBlazor()
    .AddHubOptions(options =>
    {
        options.ClientTimeoutInterval = TimeSpan.FromMinutes(10);
        options.KeepAliveInterval = TimeSpan.FromSeconds(30);
    });

app.UseEndpoints(endpoints =>
{
    endpoints.MapBlazorHub(options =>
    {
        options.WebSockets.CloseTimeout = TimeSpan.FromSeconds(10);
        options.LongPolling.PollTimeout = TimeSpan.FromMinutes(1);
    });
    endpoints.MapFallbackToPage("/_Host");
});

内容的提问来源于stack exchange,提问作者somedotnetguy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 10:31:13