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 的限制是總訊息大小。 總訊息大小可包括系統屬性和任何 Microsoft .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 小時就會中斷接聽程式的作用中連線,而接聽程式會使用重試機制與伺服器重新連線。
解決方法
當接聽程式自動重新連線到伺服器時,您不須採取任何動作。 如果您發現接聽程式未再次連線,請向支援小組提交票證。