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

多Azure Function搭配SPA应用的Signal R配置两大疑问

Azure Signal R 常见问题解答

问题1:仅使用一个Azure Signal R Hub,是否需要为50个Function App都编写negotiate函数?

不需要给每个Function App都编写这个negotiate函数。你只需要在一个专门负责Signal R连接协商的Function App中部署该函数即可。

其他Function App如果需要向Signal R Hub推送消息,直接通过Azure Signal R SDK调用Hub的消息发送接口就行,无需处理连接协商逻辑。这样做既能避免重复代码,还能统一管理身份验证逻辑(比如你代码中处理的用户ID和Claims)。

你提到的negotiate函数代码示例:

[FunctionName("negotiate")]
public SignalRConnectionInfo Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)]HttpRequest req)
{
    return Negotiate(req.Headers["x-ms-signalr-user-id"], GetClaims(req.Headers["Authorization"]));
}

问题2:拥有10余个服务计划,客户端应使用哪个URL连接Signal R Hub?

客户端必须连接到部署了上述negotiate函数的那个Function App的API地址,而不是SPA当前的origin或者其他服务计划的地址。

修改后的客户端代码示例:

<script src="https://cdnjs.cloudflare.com/ajax/libs/microsoft-signalr/3.1.7/signalr.min.js"></script>
<script>
  let messages = document.querySelector('#messages');
  // 替换为部署negotiate函数的Function App的基础URL
  const signalRNegotiateBaseUrl = "https://your-signalr-negotiate-function-app.azurewebsites.net";
  const connection = new signalR.HubConnectionBuilder()
      .withUrl(signalRNegotiateBaseUrl + '/api')
      .configureLogging(signalR.LogLevel.Information)
      .build();
    connection.on('newMessage', (message) => {
      document.getElementById("messages").innerHTML = message;
    });

    connection.start()
      .catch(console.error);
</script>

注意:如果SPA和该Function App属于不同域名,需要在Function App的CORS设置中添加SPA的域名,解决跨域访问问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 14:01:39