适用于 .NET 的 Azure Web PubSub 客户端库

注释

有关此处使用的术语的详细信息,请参阅 关键概念 文章。

客户端 SDK 旨在加快开发人员的工作流;更具体地说,

  • 简化客户端连接的管理
  • 简化在客户端之间发送消息
  • 在客户端连接意外中断后自动重试
  • 从连接中断恢复后,可靠地按照数量和顺序传递消息

如图所示,客户端与 Web PubSub 资源建立 WebSocket 连接。 屏幕截图显示客户端与 Web PubSub 资源建立 WebSocket 连接的过程

入门

安装软件包

NuGet 安装客户端库:

dotnet add package Azure.Messaging.WebPubSub.Client --prerelease

先决条件

  • Azure 订阅服务
  • 现有的 Web PubSub 实例

对客户端进行身份验证

客户端使用 Client Access URL 进行连接和身份验证服务。 Client Access URL遵循wss://<service_name>.webpubsub.azure.com/client/hubs/<hub_name>?access_token=<token>的模式。 有多种方法可以获取 Client Access URL。 作为快速开始,您可以从 Azure 门户中复制和粘贴,而在生产环境中,通常需要一个协商服务器来生成Client Access URL请参阅详细信息。

请在 Azure 门户中使用客户端访问 URL

作为快速入门,可以转到 Azure 门户,并从“密钥”边栏选项卡中复制客户端访问 URL

显示如何在 Azure 门户中获取客户端访问 URL 的屏幕截图

如图所示,客户端有权将消息发送到特定组并加入特定组。 详细了解客户端权限,请参阅 权限。

var client = new WebPubSubClient(new Uri("<client-access-uri>"));

使用协商服务器生成 Client Access URL

在生产环境中,客户端通常会从协商服务器中提取 Client Access URL 数据。 服务器保存 connection string 并生成 Client Access URL 通过 WebPubSubServiceClient。 作为示例,代码片段只是演示如何生成 Client Access URL 单个进程内部。

var client = new WebPubSubClient(new WebPubSubClientCredential(token =>
{
    // In common practice, you will have a negotiation server for generating token. Client should fetch token from it.
    return FetchClientAccessTokenFromServerAsync(token);
}));
public async ValueTask<Uri> FetchClientAccessTokenFromServerAsync(CancellationToken token)
{
    var serviceClient = new WebPubSubServiceClient("<< Connection String >>", "hub");
    return await serviceClient.GetClientAccessUriAsync();
}

用于区分WebPubSubClientWebPubSubServiceClient的功能。

类名 WebPubSubClient WebPubSubServiceClient
NuGet 包名称 Azure.Messaging.WebPubSub.Client Azure.Messaging.WebPubSub
功能 在客户端上使用。 发布消息并订阅消息。 在服务器端使用。 生成客户端访问 URI 并管理客户端

示例

从服务器和群组消费消息

客户端可以添加回调以使用来自服务器和组的消息。 请注意,客户端只能接收其已加入的群组消息。

client.ServerMessageReceived += eventArgs =>
{
    Console.WriteLine($"Receive message: {eventArgs.Message.Data}");
    return Task.CompletedTask;
};
client.GroupMessageReceived += eventArgs =>
{
    Console.WriteLine($"Receive group message from {eventArgs.Message.Group}: {eventArgs.Message.Data}");
    return Task.CompletedTask;
};

connected事件、disconnected事件和stopped事件添加回调

当客户端连接到服务时,收到来自服务的已连接消息后,connected 事件会被触发。

client.Connected += eventArgs =>
{
    Console.WriteLine($"Connection {eventArgs.ConnectionId} is connected");
    return Task.CompletedTask;
};

当客户端连接断开连接且无法恢复时, disconnected 将触发该事件。

client.Disconnected += eventArgs =>
{
    Console.WriteLine($"Connection is disconnected");
    return Task.CompletedTask;
};

客户端停止时,这意味着客户端连接已断开连接,客户端停止尝试重新连接, stopped 则会触发该事件。 这通常发生在调用client.StopAsync()或禁用AutoReconnect后。 如果要重启客户端,您可以在client.StartAsync()事件中调用Stopped

client.Stopped += eventArgs =>
{
    Console.WriteLine($"Client is stopped");
    return Task.CompletedTask;
};

自动重新加入组并处理加入失败情况

当客户端连接断开且无法恢复时,将在服务端清理所有组上下文。 这意味着客户端重新连接时,需要重新加入组。 默认情况下,客户端已启用 AutoRejoinGroups 选项。 但是,此功能有限制。 客户端只能重新加入最初 由客户端 加入的组,而不是 由服务器端加入。 由于各种原因,重新加入组操作可能会失败,例如,客户端无权加入组。 在这种情况下,用户需要添加回调来处理此类故障。

client.RejoinGroupFailed += eventArgs =>
{
    Console.WriteLine($"Restore group failed");
    return Task.CompletedTask;
};

操作和重试

默认情况下,操作(例如client.JoinGroupAsync()client.LeaveGroupAsync()client.SendToGroupAsync()client.SendEventAsync())有三次重试。 您可以使用 WebPubSubClientOptions.MessageRetryOptions 进行更改。 如果所有重试都失败,则会引发错误。 可以通过传入与之前重试相同的 ackId 来继续重试,这样服务可以帮助进行相同 ackId 的去重操作。

// Send message to group "testGroup"
try
{
    await client.JoinGroupAsync("testGroup");
}
catch (SendMessageFailedException ex)
{
    if (ex.AckId != null)
    {
        await client.JoinGroupAsync("testGroup", ackId: ex.AckId);
    }
}

故障排除

启用日志

可以使用此库设置以下环境变量来获取调试日志。

export AZURE_LOG_LEVEL=verbose

有关如何启用日志的更详细说明,可以查看 @azure/记录器包文档

实时跟踪

使用 Azure 门户中的 实时跟踪工具 通过 Web PubSub 资源检查实时消息流量。