Azure 中继异常
本文列出了可能由 Azure 中继 API 生成的一些异常。 这些参考信息可随时更改,请不时返回查看更新内容。
异常类别
中继 API 生成的异常可以分为以下类别。 此外还列出了解决这些异常应采取的建议操作。
用户编码错误:System.ArgumentException、System.InvalidOperationException、System.OperationCanceledException、System.Runtime.Serialization.SerializationException。
常规操作:继续之前尝试修复代码。
设置/配置错误:System.UnauthorizedAccessException。
常规操作:检查配置。 必要时更改配置。
暂时性异常:Microsoft.ServiceBus.Messaging.MessagingException、Microsoft.ServiceBus.Messaging.ServerBusyException、Microsoft.ServiceBus.Messaging.MessagingCommunicationException。
常规操作:重试操作或通知用户。
其他异常:System.Transactions.TransactionException、System.TimeoutException。
常规操作:特定于异常类型。 请参阅以下部分中的表。
异常类型
下表列出了消息异常的类型及其原因, 并说明可以采取的有助于解决异常的建议性操作。
异常类型 | 说明 | 建议的操作 | 自动或立即重试注意事项 |
---|---|---|---|
超时 | 服务器在 OperationTimeout 控制的指定时间内未响应请求的操作。 服务器可能已完成请求的操作。 这可能是由于网络或其他基础结构延迟造成的。 | 检查系统状态的一致性,并根据需要重试。 请参阅 TimeoutException。 | 在某些情况下,重试可能会有帮助;在代码中添加重试逻辑。 |
操作无效 | 不允许在服务器或服务中执行请求的用户操作。 有关详细信息,请查看异常消息。 | 检查代码和文档。 确保请求的操作有效。 | 重试不起作用。 |
操作已取消 | 尝试对已关闭、中止或释放的对象调用某个操作。 在极少数情况下,环境事务已释放。 | 检查代码并确保代码不会对已释放的对象调用操作。 | 重试不起作用。 |
未授权访问 | TokenProvider 对象无法获取令牌,该令牌无效,或者令牌不包含执行操作所需的声明。 | 确保使用正确的值创建令牌提供程序。 检查访问控制服务的配置。 | 在某些情况下,重试可能会有帮助;在代码中添加重试逻辑。 |
参数异常; 参数为 Null; 参数超出范围 |
出现下述一个或多个情况: 提供给该方法的一个或多个参数均无效。 提供给 NamespaceManager 或 Create 的 URI 包含一个或多个路径段。 提供给 NamespaceManager 或 Create 的 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 小时断开一次侦听器活动连接,侦听器将使用重试机制与服务器重新连接。
解决方法
当侦听器自动重新连接到服务器时,你无需执行任何操作。 如果你注意到侦听器并未再次连接,请向支持团队提交票证。