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 方法。 - 方法名转为小写查找,因此
Add与add解析到同一方法。
特殊参数
命名参数注入连接上下文与取消能力:
| 参数名 | 注入值 |
|---|---|
context / hub_context | HubContext(见下) |
cancellation_token / cancellationToken | asyncio.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_connected 与 on_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_errors为True:
server = SignalRServer(MyHub, options=ServerOptions(enable_detailed_errors=True))
启动服务器
server = SignalRServer(MyHub)
await server.serve("127.0.0.1", 8080, path="/hub")
服务器选项:
| 选项 | 默认 | 说明 |
|---|---|---|
keep_alive_interval | 15.0 | 服务器心跳间隔 |
client_timeout_interval | 30.0 | 静默客户端的超时 |
handshake_timeout | 15.0 | 握手截止时间 |
maximum_parallel_invocations | 1 | 每连接并发调用数 |
maximum_receive_message_size | 32 KiB | 最大入站帧大小 |
stream_buffer_capacity | 10 | 每个上传流的队列容量 |
long_polling_timeout | 15.0 | Long Polling 轮询时长 |
enable_detailed_errors | False | 向客户端发送异常详情 |
allow_stateful_reconnects | False | 开启状态化重连 |
stateful_reconnect_buffer_size | 100_000 | 出站缓冲字节上限 |
stateful_reconnect_timeout | 30.0 | 断线连接保留的最大时长 |