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 小时断开一次侦听器活动连接,侦听器将使用重试机制与服务器重新连接。

解决方法

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

后续步骤