多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
相关产品推荐
相关产品推荐

