Azure 中继异常

本文列出了可能由 Azure 中继 API 生成的一些异常。 这些参考信息可随时更改,请不时返回查看更新内容。

异常类别

中继 API 生成的异常可以分为以下类别。 此外还列出了解决这些异常应采取的建议操作。

异常类型

下表列出了消息异常的类型及其原因, 并说明可以采取的有助于解决异常的建议性操作。

异常类型 说明 建议的操作 自动或立即重试注意事项
超时 服务器在 OperationTimeout 控制的指定时间内未响应请求的操作。 服务器可能已完成请求的操作。 这可能是由于网络或其他基础结构延迟造成的。 检查系统状态的一致性,并根据需要重试。 请参阅 TimeoutException 在某些情况下,重试可能会有帮助;在代码中添加重试逻辑。
操作无效 不允许在服务器或服务中执行请求的用户操作。 有关详细信息,请查看异常消息。 检查代码和文档。 确保请求的操作有效。 重试不起作用。
操作已取消 尝试对已关闭、中止或释放的对象调用某个操作。 在极少数情况下,环境事务已释放。 检查代码并确保代码不会对已释放的对象调用操作。 重试不起作用。
未授权访问 TokenProvider 对象无法获取令牌,该令牌无效,或者令牌不包含执行操作所需的声明。 确保使用正确的值创建令牌提供程序。 检查访问控制服务的配置。 在某些情况下,重试可能会有帮助;在代码中添加重试逻辑。
参数异常
参数为 Null
参数超出范围
出现下述一个或多个问题:
提供给该方法的一个或多个参数均无效。
提供给 NamespaceManagerCreate 的 URI 包含一个或多个路径段。
提供给 NamespaceManagerCreate 的 URI 方案无效。
属性值大于 32 KB。
检查调用代码并确保参数正确。 重试不起作用。
服务器忙 服务目前无法处理请求。 客户端可以等待一段时间,并重试操作。 客户端可以在特定的时间间隔后重试。 如果重试导致其他异常,请检查该异常的重试行为。
超出配额 消息实体已达到其最大允许大小。 通过从实体或其子队列接收消息在该实体中创建空间。 请参阅QuotaExceededException 如果同时已删除消息,则重试可能会有帮助。
超出消息大小 消息有效负载超出 256 KB 限制。 256-KB 限制是指总消息大小。 总消息大小可能包括系统属性和任何 Azure .NET 开销。 减少消息负载的大小,并重试操作。 重试不起作用。

QuotaExceededException

QuotaExceededException 指示已超出某个特定实体的配额。

对于中继,此异常包含 System.ServiceModel.QuotaExceededException,指示已超过此终结点的最大侦听器数目。 这会以异常消息的 MaximumListenersPerEndpoint 值表示。

TimeoutException

TimeoutException 指示用户启动的操作所用的时间超过操作超时值。

检查 ServicePointManager.DefaultConnectionLimit 属性的值。 达到此限制也可能导致 TimeoutException

对于中继,可能会在第一次打开中继发送方连接时收到超时异常。 此异常有两个常见的原因:

  • OpenTimeout 值可能太小(甚至只有几分之一秒)。
  • 本地中继侦听器可能无响应(或者可能遇到禁止侦听器接受新客户端连接的防火墙规则问题),而 OpenTimeout 值约小于 20 秒。

示例:

'System.TimeoutException': The operation did not complete within the allotted timeout of 00:00:10.
The time allotted to this operation may have been a portion of a longer timeout.

常见原因

此错误有两个常见的原因:

  • 配置不正确

    运行条件下的操作超时值可能太小。 客户端 SDK 的操作超时默认值为 60 秒。 请查看代码中的值是否设置过小。 CPU 使用率和网络条件可能会影响操作完成时间。 最好是不要将操作超时设置为很小的值。

  • 临时服务错误

    有时,中继服务在处理请求时可能会遇到延迟。 例如,在流量高峰时段可能会发生这种情况。 如果发生这种情况,可以在延迟后重试操作,直到操作成功为止。 如果多次尝试同一操作后仍然失败,请访问 Azure 服务状态站点,看是否有已知的服务中断。

ConnectionLostException - NameRenewalFailed

现象

客户端收到异常:Microsoft.Azure.Relay.ConnectionLostException : InternalServerError: NameRenewalFailed

原因

Azure 中继服务每 24 小时重启一次侦听器连接。 此行为是设计使然。 Azure 中继服务每 24 小时断开一次侦听器活动连接,侦听器将使用重试机制与服务器重新连接。

解决方法

当侦听器自动重新连接到服务器时,你无需执行任何操作。 如果你注意到侦听器并未再次连接,请向支持团队提交票证

后续步骤