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

备注

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

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

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

如图所示,客户端与 Web PubSub 资源建立 WebSocket 连接。 Screenshot showing clients establishing WebSocket connection with a Web PubSub resource

入门

安装包

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”。

Screenshot showing how to get Client Access Url on Azure portal

如图所示,向客户端授予向特定组发送消息和加入特定组的权限。 请参阅权限,详细了解客户端权限。

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

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

在生产环境下,客户端通常从协商服务器提取 Client Access URL。 服务器存放 connection string 并通过 WebPubSubServiceClient 生成 Client Access URL。 作为示例,代码片段只是演示如何在单个进程中生成 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
功能 在客户端使用。 发布消息并订阅消息。 在服务器端使用。 生成客户端访问 URL 并管理客户端

示例

使用来自服务器和组的消息

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

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;
};

connecteddisconnectedstopped 事件添加回调

当客户端连接连接到服务时,一旦收到来自该服务的连接消息,就会触发 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 后发生。 如果要重启客户端,可以在事件 Stopped 中调用 client.StartAsync()

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/logger 包文档

实时跟踪

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