如果您想实现无服务器架构,您应该使用Azure Functions。典型的无服务器架构将如下所示。
客户端(即浏览器)向Azure函数发送协商请求,响应包含建立与Azure SignalR连接所需的所有信息。您应该将JWT令牌附加到协商请求中。如何获取JWT令牌由您决定。附加它非常简单,只需在创建SignalR连接时提供令牌工厂即可。
const connection = new signalR.HubConnectionBuilder()
.withUrl('link to your azure functions api', {
accessTokenFactory: () => {
return 'your token'
}
})
.build();
为了使此功能正常工作,您还需要设置一个
upstream连接,以便您的
Azure SignalR
服务可以将所有事件转发到您的Azure函数。Azure函数处理上游事件并向
Azure SignalR
发送请求,以向给定用户或多个用户广播数据。
hub
中SendMessage
方法的代码与常规的hub非常相似,除了Azure函数绑定。您还需要扩展ServerlessHub
类而不是Hub
,并安装Microsoft.Azure.WebJobs.Extensions.SignalRService
包。
public class ChatHub : ServerlessHub
{
[FunctionName(nameof(SendToUser))]
public async Task SendToUser([SignalRTrigger] InvocationContext invocationContext, string userName, string message)
{
await Clients.User(userName).SendAsync("new_message", new NewMessage(invocationContext, message));
}
[FunctionName("negotiate")]
public SignalRConnectionInfo Negotiate([HttpTrigger(AuthorizationLevel.Anonymous)] HttpRequest req)
{
var claims = GetClaims(req.Headers["Authorization"]);
var userName = claims.First(x => x.Type == ClaimTypes.NameIdentifier);
return Negotiate(userName.Value, claims);
}
private class NewMessage
{
public string ConnectionId { get; }
public string Sender { get; }
public string Text { get; }
public NewMessage(InvocationContext invocationContext, string message)
{
Sender = string.IsNullOrEmpty(invocationContext.UserId) ? string.Empty : invocationContext.UserId;
ConnectionId = invocationContext.ConnectionId;
Text = message;
}
}
}
你可以在
这里找到一份带有逐步说明的代码示例。
编辑:
如果你不想完全使用无服务器架构,而是想使用常规的 Web 应用程序,那也完全没问题。架构图将如下所示。
在这种情况下,您应该使用常规的hub类。您发布的代码应该可以正常工作。
连接管理完全由Azure Signalr服务完成,您不需要进行任何额外的同步,也不需要将连接数据存储在数据库中。只需设置层大小和单位数量。
以下是它如何工作的简短描述:
1.客户端(例如浏览器中的Js客户端)向Web应用程序发送请求到negotiate端点,并接收到指向Azure Signalr服务和访问令牌的链接。这是一个JWT令牌。 JWT令牌由几个部分组成。该令牌的第二部分是有效负载,其中包含声明。
2.使用从negotiate端点获取的数据,客户端连接到Azure Signalr服务。
因此,Azure SignalR服务使用从协商端点接收到的访问令牌来验证用户。您不必为此编写任何其他代码,库已经在后台完成了所有操作。
如果您使用Web应用程序,则SignalR SDK处理negotiate请求,您不需要为此编写任何其他代码。
这些都在本文中有详细描述。
你可以在这里找到有关实现身份验证的详细指南。