你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure 通信网关预配 API
使用 Azure 通信网关为电信运营商预配 API,可以将客户的详细信息以及分配给他们的号码预配到 Azure 通信网关 (ACG) 。 预配 API 还支持某些后端通信服务的流式预配。
对于除运营商连接和 (Teams 电话 Mobile 之外的所有用例,必须使用预配 API 或基于浏览器的数字管理门户) 预配客户和号码。 对于运营商连接和Teams 电话移动版,预配 API 和/或数字管理门户是可选的,可以直接与操作员连接 API 集成。
入门
先决条件
- 部署了 Azure 通信网关应用程序的租户。
- Azure 通信网关的完全限定域名 (FQDN) ,显示在Azure 门户资源的“概述”页上。 API 在 的
provapi.<base-domain>
端口 443 上可用。 - 一台具有允许访问 API 的 IP 地址的计算机,如部署 Azure 通信网关时在允许列表中配置的那样。
身份验证和授权
预配 API 使用 OAuth 2.0 来控制对资源的访问。 客户端应用程序必须获取有效的身份验证持有者令牌才能访问预配 API。 持有者令牌指示应用程序已授权用于预配 API 的一个或多个范围 (角色) 。 建议使用专为服务器端进程) 设计的 客户端凭据流 (。
以下范围可用于预配 API:
-
ProvisioningAPI.Admin
:能够跨 API 调用任何操作。 -
ProvisioningAPI.Read
:能够跨 API 调用任何读取 (GET) 操作。 -
ProvisioningAPI.Write
:能够跨 API 调用任何写入 (PUT、PATCH) 操作。 -
ProvisioningAPI.Delete
:能够跨 API 调用任何删除 (DELETE) 操作。
设置客户端凭据流:
- 确保应用程序可以支持客户端凭据流。
当应用程序请求预配 API 的令牌时,它必须使用以下字段。
参数 条件 说明 tenant 必填 包含 Azure 通信网关的目录租户,采用 guid 或域名形式。 scope 必需 针对 Azure 通信网关资源 ID 的授权范围。 对于此处所述的客户端凭据流,范围应为 https://func-voiceservice-rp-prod-eastuseuap.azurewebsites.net/.default
。client_id 必需 应用程序 (分配给应用的客户端) ID。 roles
收到的令牌中的声明指定客户端应用程序有权访问的角色 (作用域) 。对 Azure 通信网关预配平台的请求必须具有具有此持有者令牌的
Authorization
标头。有关使用令牌的示例,请参阅 客户端凭据流文档 。
- 使用 Azure 门户 在 Azure 通信网关部署所在的同一租户中注册应用程序。 请参阅快速入门:在Microsoft 标识平台中注册应用 - Microsoft Entra |Microsoft Learn。
- 将自己分配为应用注册的所有者。 请参阅 分配应用程序所有者。
- 如前所述,通过向使用预配 API 作用域的应用角色注册应用程序来配置创建的应用注册。
- 请参阅 将应用角色分配给应用程序。
- 需要为其分配权限的 API 在
AzureCommunicationsGateway
组织使用的 API 下列出。
- 作为租户的管理员,允许应用程序使用你分配的应用角色。 请参阅 授予管理员同意。
预配 API 对安全证书使用标准 Microsoft 信任链。
关键概念
预配平台有三个关键资源,操作员可以管理:帐户、数字和信息请求。
- 帐户 资源通常描述操作员客户 (、企业) 以及服务预配的按客户设置。
- 属于帐户的资源数 。 它们描述数字、服务 (例如,数字使用的 Microsoft Teams 直接路由) ,以及任何额外的按编号配置。
- 请求信息 (RFI) 资源是针对表示有兴趣通过特定后端服务从操作员接收服务的操作员的潜在客户的说明。 目前,只有 Operator Connect 和 Teams 电话 Mobile 许可生成的 RFI 可用。
例如,若要向客户提供 Microsoft Teams 直接路由服务,Contoso 使用 Contoso 的预配 API 创建帐户资源。 该帐户包含直接路由的配置 (例如,子域和相应的令牌是设置 DNS 记录所需的,Microsoft Teams 可以使用这些记录来验证客户的配置) 。 然后,必须将号码资源添加到帐户,并为直接路由启用每个号码。
提示
必须同时对帐户中的帐户和号码启用服务。
使用后端服务同步预配后端服务
Azure 通信网关必须包含有关其提供服务的号码的信息,才能正确连接呼叫。 建议使用 Azure 通信网关预配 API 向 Azure 通信网关提供此信息,但也可以使用数字管理门户。 大多数后端服务还需要预配有关要使用的数字和帐户的信息。 此要求通常意味着需要多个 IT 集成项目才能启用新服务。 Azure 通信网关预配平台已预集成一些后端服务,以便为你预配它们,从而减少 IT 集成要求。 可以通过为相关 服务启用后端服务同步 来使用此函数。 这也意味着,与 Azure 通信网关预配平台的任何 IT 集成对于其他后端服务都是可重用的。
例如,Operator Connect 要求通过 Operator Connect API 上传所有号码。 如果为操作员连接启用了后端服务同步,则预配到 Azure 通信网关并为 Operator Connect 启用的任何号码将自动预配到 Operator Connect 中,这意味着无需与操作员连接 API 集成。
对于某些服务,可以通过 Azure 通信网关预配平台进行预配是可选的,其中 Azure 通信网关可以直接从后端获取信息。 但是,某些功能(例如为计费目的添加客户 SIP 标头)将不可用。 对于不支持后端服务同步的任何服务,可能需要直接与后端服务进行其他 IT 集成。 下表描述了预配支持的状态:
后端服务 | 通过 ACG 预配平台进行预配的要求 | 支持的后端服务的预配 |
---|---|---|
直接路由 | 必需 | ❌ |
Zoom | 必需 | ❌ |
Azure 运营商通话保护 | 必需 | ❌ |
Operator Connect | 可选 | ✅ |
Teams 电话 Mobile | 可选 | ✅ |
同步到后端服务是异步的,这意味着预配请求可能会在预配后端服务之前成功。 此状态使用 serviceProvisioningStatus
设置为 pending
的字段在 API 响应中表示。 建议查询 对象以检查其预配状态,直到此字段设置为 success
。 预配后端系统的任何错误都直接显示在响应中。
示例
以下示例显示了用于管理 RFI、帐户和数字的示例请求。
Create代表客户的帐户
在终结点上使用 accounts/<accountName>
PUT 为客户 Contoso 创建名为 contoso
的帐户,并为该帐户配置一个或多个通信服务。 使用 If-None-Match 标头验证具有此名称的帐户资源尚不存在。
在以下示例中:
- 配置了直接路由。
- (默认) 启用呼叫者 ID 筛选。
- 客户的子域为
contoso
。 - 设置 DNS 记录所需的客户提供的 DNS TXT 值位于
region1Token
和region2Token
字段中。
请求:
PUT /accounts/contoso?api-version=2024-02-29 HTTP/1.1
{
"name": "contoso",
"serviceDetails": {
"teamsDirectRouting": {
"syncEnabled": true,
"enabled": true,
"configuration": {
"callScreening": true,
"subdomain": "contoso",
"subdomainTokens": {
"region1Token": "region1TokenValue",
"region2Token": "region2TokenValue"
}
}
}
}
}
响应:
{
"serviceProvisioningStatus": "synced",
"serviceProvisioningErrors": null,
"name": "contoso",
"serviceDetails": {
"teamsDirectRouting": {
"syncEnabled": true,
"enabled": true,
"numberCount": 0,
"configuration": {
"callScreening": true,
"subdomain": "contoso",
"subdomainTokens": {
"region1Token": "region1TokenValue",
"region2Token": "region2TokenValue"
}
},
"subdomainStatus": "provisioned"
},
}
}
在以下示例中,我们将创建一个帐户,以便仅与 Teams 操作员连接一起使用,并且启用了后端同步,以便将有关此帐户的信息 ((例如上传) 的任何数字)预配到 Teams 中:
请求:
PUT /accounts/contoso?api-version=2024-02-29 HTTP/1.1
{
"name": "contoso",
"serviceDetails": {
"teamsTenantId": "tenantIdString",
"teamsOperatorConnect": {
"syncEnabled": true,
"enabled": true
},
}
}
响应:
{
"serviceProvisioningStatus": "pending",
"serviceProvisioningErrors": null,
"name": "contoso",
"serviceDetails": {
"teamsTenantId": "tenantIdString",
"teamsOperatorConnect": {
"syncEnabled": true,
"enabled": true,
"numberCount": 0
}
}
}
查看帐户的详细信息
在终结点上使用 accounts/<accountName>
GET 获取帐户的详细信息。 响应包括以下字段:
- 以前设置的所有配置 (,如果未设置字段,则为默认值) 。
- ACG 上每个可用服务的订阅者计数。
- 后端服务预配的状态(如果已启用)。
-
subdomainStatus
,表示 DNS 记录预配的状态,仅与直接路由相关。 - 表示
ETag
帐户当前状态的标头。 可以在后续更新请求的标头中使用If-Match
值,以确保不会覆盖其他 API 用户所做的更改。
请求:
GET /accounts/contoso?api-version=2024-02-29 HTTP/1.1
响应:
ETag: 12345
{
"serviceProvisioningStatus": "synced",
"serviceProvisioningErrors": null,
"name": "contoso",
"serviceDetails": {
"teamsTenantId": "tenantIdString",
"teamsOperatorConnect": {
"syncEnabled": true,
"enabled": true,
"numberCount": 0
},
}
}
如果帐户配置了多个服务,则等效请求如下所示:
请求:
GET /accounts/contoso?api-version=2024-02-29 HTTP/1.1
响应:
ETag: 12345
{
"serviceProvisioningStatus": "synced",
"serviceProvisioningErrors": null,
"name": "contoso",
"serviceDetails": {
"teamsTenantId": "tenantIdString",
"teamsOperatorConnect": {
"syncEnabled": true,
"enabled": true
},
"teamsDirectRouting": {
"syncEnabled": true,
"enabled": true,
"numberCount": 0,
"configuration": {
"callScreening": true,
"subdomain": "contoso",
"subdomainTokens": {
"region1Token": "region1",
"region2Token": "region2"
}
},
"subdomainStatus": "provisioned"
},
}
}
更新帐户的配置
在终结点上使用 accounts/<accountName>
PUT 更新帐户的配置。 若要确保更新不会覆盖其他用户所做的更改,请从帐户的最新响应中添加 If-Match
包含 ETag 的标头。
请求:
PUT /accounts/contoso?api-version=2024-02-29 HTTP/1.1
ETag: 12345
{
"name": "contoso",
"serviceDetails": {
"teamsTenantId": "tenantIdString",
"teamsOperatorConnect": {
"syncEnabled": false,
"enabled": true
},
"teamsDirectRouting": {
"syncEnabled": true,
"enabled": true,
"numberCount": 0,
"configuration": {
"callScreening": true,
"subdomain": "contoso",
"subdomainTokens": {
"region1Token": "region1",
"region2Token": "region2"
}
},
"subdomainStatus": "provisioned"
},
}
}
响应:
ETag: 56789
{
"serviceProvisioningStatus": "pending",
"serviceProvisioningErrors": null,
"name": "contoso",
"serviceDetails": {
"teamsTenantId": "tenantIdString",
"teamsOperatorConnect": {
"syncEnabled": false,
"enabled": true
},
"teamsDirectRouting": {
"syncEnabled": true,
"enabled": true,
"numberCount": 0,
"configuration": {
"callScreening": true,
"subdomain": "contoso",
"subdomainTokens": {
"region1Token": "region1",
"region2Token": "region2"
}
},
"subdomainStatus": "provisioned"
},
}
}
向帐户添加一个数字
在终结点上使用 account/<accountName>/numbers/<telephoneNumber>
PUT 将数字添加到帐户、启用一个或多个通信服务以及添加任何其他配置。 还必须在帐户上配置所选的通信服务。 使用 If-None-Match 标头来验证具有此编号的数字资源是否存在。 必须以 E.164 格式创建所有数字。
在以下示例中:
- 数字为 +123451。
- 已启用操作员连接。
- 提供了将号码上传到 Operator Connect 所需的配置
-
customSipHeader
指定 Azure 通信网关应向发送到运营商网络的消息添加具有 值的exampleHeaderContents
标头。 标头的名称在部署 Azure 通信网关时设置。 -
serviceProvisioningStatus
响应中的 字段显示同步到后端服务的状态。
PUT /accounts/contoso/numbers/+123451?api-version=2024-02-29 HTTP/1.1
{
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"configuration": {
"usage": "CallingUserAssignment",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
}
响应:
{
"serviceProvisioningStatus": "pending",
"serviceProvisioningErrors": null,
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"assignmentStatus": "assigned",
"configuration": {
"usage": "CallingUserAssignment",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
}
一段时间后检查预配状态
在预配操作后使用 account/<accountName>/numbers/<telephoneNumber>
GET 来检查数字的状态。 如果已成功预配数字,则 serviceProvisioningStatus
字段将从 pending
更新为 synced
。
请求:
GET /accounts/contoso/numbers/+123451?api-version=2024-02-29 HTTP/1.1
响应:
{
"serviceProvisioningStatus": "synced",
"serviceProvisioningErrors": null,
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"assignmentStatus": "assigned",
"configuration": {
"usage": "CallingUserAssignment",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
}
后端服务预配中上传数字时出错
在此示例中,上传数字时的后端预配将遇到错误,该错误将反映在响应中。 错误消息以透明方式从后端服务传递。
注意
最初,在预配数字时,它具有 pending
状态,需要再次查询以确认成功/失败。
原始请求,缺少 字段的值 usage
:
PUT /accounts/contoso/numbers/+123451?api-version=2024-02-29 HTTP/1.1
{
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"configuration": {
"usage": "",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
}
一段时间后 GET 查询的响应:
{
"serviceProvisioningStatus": "failed",
"serviceProvisioningErrors": [
{
"code": "InvalidRequest",
"message": "Invalid/missing required configuration attributes: Usage",
"target": "oc",
}
],
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"assignmentStatus": "assigned",
"configuration": {
"usage": "",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
更新数字的配置
在终结点上使用 account/<accountName>/numbers/<telephoneNumber>
PUT 更新数字的配置。 若要确保更新不会覆盖其他用户所做的更改,请添加一个 If-Match 标头,其中包含该数字的最新响应中的 ETag。
请求:
PUT /accounts/contoso/numbers/+123451?api-version=2024-02-29 HTTP/1.1
ETag: 123
{
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"configuration": {
"usage": "CallingUserAssignment",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling",
"Mobile"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
}
响应:
{
"serviceProvisioningStatus": "pending",
"serviceProvisioningErrors": null,
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"assignmentStatus": "assigned",
"configuration": {
"usage": "CallingUserAssignment",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling",
"Mobile"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
}
列出信息请求
使用终结点上的 /teamsRequestsForInformation
GET 获取潜在客户已提交给你的 Teams 同意列表。
请求:
GET /teamsRequestsForInformation?api-version=2024-02-29 HTTP/1.1
响应:
{
"value": [
{
"serviceProvisioningStatus": "synced",
"serviceProvisioningErrors": null,
"id": "contoso",
"tenantId": "contosoTenantId",
"accountName": "contoso",
"productContext": "teams",
"operatorId": "string",
"status": "active",
"consentedOn": "2024-05-07T11:15:10.519Z",
"lastModifiedOn": "2024-05-07T11:15:10.519Z",
"consentedCountries": [
"string"
],
"contacts": [
{
"fullName": "Example Name",
"email": "example@contoso.com",
"telephoneNumber": "+1234567890",
"companyName": "contoso",
"companySize": "size"
}
],
"customerRelationship": {
"status": "example status",
"lastModifiedOn": "2024-05-07T11:15:10.520Z",
"comment": "example comment"
}
},
{
"serviceProvisioningStatus": "synced",
"serviceProvisioningErrors": null,
"id": "contoso2",
"tenantId": "contosoTenantId2",
"accountName": "contoso2",
"productContext": "teams",
"operatorId": "string",
"status": "active",
"consentedOn": "2024-05-07T11:15:10.519Z",
"lastModifiedOn": "2024-05-07T11:15:10.519Z",
"consentedCountries": [
"string"
],
"contacts": [
{
"fullName": "Example Name2",
"email": "example@contoso2.com",
"telephoneNumber": "+1234567891",
"companyName": "contoso2",
"companySize": "size"
}
],
"customerRelationship": {
"status": "example status",
"lastModifiedOn": "2024-05-07T11:15:10.520Z",
"comment": "example comment"
}
},
... // more RFIs
],
"nextLink": "string"
}
更新信息请求
在终结点上使用 /teamsRequestsForInformation/<tenantID>
PATCH 更新 RFI 的状态,该状态反映在后端服务中。 操作员连接和 Teams 电话 Mobile 允许将请求的状态指示回最终客户,以便更新的状态显示在客户的 Teams 管理员中心。
请求
PATCH /teamsRequestsForInformation/contosoTenantId
{
"customerRelationship": {
"status": "new status",
"comment": "new comment"
}
}
响应
{
{
"serviceProvisioningStatus": "pending",
"serviceProvisioningErrors": null,
"id": "contoso",
"tenantId": "contosoTenantId",
"accountName": "contoso",
"productContext": "teams",
"operatorId": "string",
"status": "active",
"consentedOn": "2024-05-07T11:15:10.519Z",
"lastModifiedOn": "2024-05-07T11:15:10.519Z",
"consentedCountries": [
"string"
],
"contacts": [
{
"fullName": "Example Name",
"email": "example@contoso.com",
"telephoneNumber": "+1234567890",
"companyName": "contoso",
"companySize": "size"
}
],
"customerRelationship": {
"status": "new status",
"lastModifiedOn": "2024-05-07T12:15:10.520Z",
"comment": "new comment"
}
}
}
列出分配给帐户的所有号码
使用终结点上的 /accounts/<accountName>/numbers
GET 请求获取已为该帐户预配的号码列表。
请求:
GET /accounts/contoso/numbers?api-version=2024-02-29 HTTP/1.1
针对仅包含 Operator Connect 号码的帐户的响应:
{
"value": [
{
"serviceProvisioningStatus": "pending",
"serviceProvisioningErrors": null,
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"assignmentStatus": "assigned",
"configuration": {
"usage": "CallingUserAssignment",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling",
"Mobile"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
},
... // more OC numbers
],
nextLink: "string"
}
针对预配了操作员连接和直接路由号码的帐户的响应:
{
"value": [
{
"serviceProvisioningStatus": "synced",
"serviceProvisioningErrors": null,
"telephoneNumber": "+123451",
"accountName": "contoso",
"serviceDetails": {
"teamsOperatorConnect": {
"enabled": true,
"assignmentStatus": "assigned",
"configuration": {
"usage": "CallingUserAssignment",
"choosableCapabilities": [
"InboundCalling",
"OutboundCalling",
"Mobile"
],
"civicAddressId": "civicAddressIdString",
"allowTenantAddressUpdate": true,
}
},
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
},
{
"serviceProvisioningStatus": "synced",
"serviceProvisioningErrors": null,
"telephoneNumber": "+123452",
"accountName": "contoso",
"serviceDetails": {
"teamsDirectRouting": {
"enabled": true
}
},
"configuration": {
"customSipHeader": "exampleHeaderContents"
}
},
... // more DR and OC numbers
],
nextLink: "string"
}
列出特定帐户的所有紧急位置
使用终结点上的 /accounts/<accountName>/teamsCivicAddresses
GET 请求获取在 Teams 管理员 中心为该帐户配置的公民地址的完整列表。 在帐户中创建或更新数字时,可以使用此列表的填充作为 locationid
。
请求:
GET /accounts/contoso/teamsCivicAddresses?api-version=2024-02-29 HTTP/1.1
响应:
{
"value": [
{
"id": "string",
"country": "string",
"houseNumber": "string",
"houseNumberSuffix": "string",
"preDirectional": "string",
"streetName": "string",
"streetSuffix": "string",
"postDirectional": "string",
"stateOrProvince": "string",
"countyOrDistrict": "string",
"cityOrTown": "string",
"cityOrTownAlias": "string",
"postalOrZipCode": "string",
"description": "string",
"companyName": "string",
"companyId": "string",
"defaultLocationId": "string",
"validationStatus": "notValidated",
"tenantId": "string",
"partnerId": "string",
"locations": [
{
"id": "string",
"civicAddressId": "string",
"description": "string",
"additionalInfo": "string",
"isDefault": true,
"elin": "string"
}
],
"latitude": "string",
"longitude": "string"
},
... // more locations
],
"nextLink": "string"
}
从帐户中删除号码
在终结点上使用 /accounts/<accountName>/numbers/<telephoneNumber>
DELETE 从租户释放数字。 此操作将取消分配用户的号码(如果已分配)并从租户释放该号码。
请求:
DELETE /accounts/contoso/numbers/+123451?api-version=2024-02-29 HTTP/1.1
响应:
204 Status Code
故障排除
Teams 直接路由不适用于帐户上的号码。
- 通过在帐户上发送 GET 来检查 DNS 令牌是否已验证,并
serviceDetails.teamsDirectRouting
验证是否subdomainStatus
等于Provisioned
。
- 通过在帐户上发送 GET 来检查 DNS 令牌是否已验证,并
我已将一个数字配置为使用直接路由/缩放,但它似乎不起作用。
- 检查帐户是否已配置为使用直接路由/缩放,以及该号码是否启用了此特定功能。
我设法联系了 API,但在发出多个请求后,我的连接开始超时。
- 预配 API 的速率限制为 (合理的每秒速率) 。 请分隔请求空间,或使用批处理终结点,以避免速率受限。 速率限制最终超时,你将能够进行连接。
后续步骤
开始与 Azure 通信网关预配 API 集成。