跳到主要内容

Hub 与方法

定义 hub

继承 Hub 并定义公共方法。分发器对方法名不区分大小写。

from aiosignalr.server import Hub


class MathHub(Hub):
async def add(self, a: int, b: int) -> int:
return a + b

方法解析规则

  • 只解析公共方法 —— 以 _ 开头的方法与从 Hub 继承的成员会被忽略。
  • 异步生成器方法(async def ... yield)是流式方法,其余是单结果方法。 用非流式方式调用流式方法(或反之)会返回错误。
  • 返回类型注解决定是否回发返回值:非 None 的返回注解把方法标记为有结果。 用 -> None(或不写注解)表示 void 方法。
  • 方法名转为小写查找,因此 Addadd 解析到同一方法。

特殊参数

命名参数注入连接上下文与取消能力:

参数名注入值
context / hub_contextHubContext(见下)
cancellation_token / cancellationTokenasyncio.Event,取消时置位
class ProbeHub(Hub):
async def slow(self, n: int, cancellation_token: Any = None) -> int:
for i in range(n):
await asyncio.sleep(0.05)
if cancellation_token is not None and cancellation_token.is_set():
return -1
return n

Hub 上下文

self.context 提供连接元数据:

class MyHub(Hub):
async def whoami(self) -> str:
return self.context.connection_id

async def headers(self) -> dict[str, str]:
return self.context.headers
属性说明
connection_id调用连接的唯一 id
headers首个请求的 HTTP 请求头
query首个请求的查询串参数
user_id用户标识(如已设置)

生命周期钩子

on_connectedon_disconnected 按连接调用:

class ChatHub(Hub):
async def on_connected(self) -> None:
await self.clients.all_.send("message", f"{self.context.connection_id} joined")

async def on_disconnected(self, exception) -> None:
print(f"{self.context.connection_id} left: {exception}")

on_connected 每条逻辑连接只调用一次(包括跨状态化重连)。

错误

hub 方法抛异常时,客户端收到带错误信息的 Completion,调用在客户端抛 HubException

  • HubException 子类的消息原样透传。
  • 其他异常转为通用消息,除非 ServerOptions.enable_detailed_errorsTrue
server = SignalRServer(MyHub, options=ServerOptions(enable_detailed_errors=True))

启动服务器

server = SignalRServer(MyHub)
await server.serve("127.0.0.1", 8080, path="/hub")

服务器选项:

选项默认说明
keep_alive_interval15.0服务器心跳间隔
client_timeout_interval30.0静默客户端的超时
handshake_timeout15.0握手截止时间
maximum_parallel_invocations1每连接并发调用数
maximum_receive_message_size32 KiB最大入站帧大小
stream_buffer_capacity10每个上传流的队列容量
long_polling_timeout15.0Long Polling 轮询时长
enable_detailed_errorsFalse向客户端发送异常详情
allow_stateful_reconnectsFalse开启状态化重连
stateful_reconnect_buffer_size100_000出站缓冲字节上限
stateful_reconnect_timeout30.0断线连接保留的最大时长

下一步