Azure Relay の例外
この記事では、Azure Relay API によって生成されることのある例外を示します。 このリファレンスは変更される可能性があるため、最新情報をご確認ください。
例外のカテゴリ
Relay 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 オブジェクトはトークンを取得できませんでした。トークンが無効です。または、操作の実行に必要な要求がトークンに含まれていません。 | 正しい値を使用してトークン プロバイダーを作成します。 Access Control Service の構成を確認します。 | 再試行によって解決する場合があります。再試行ロジックをコードに追加してください。 |
引数の例外、 引数が null、 範囲外の引数 |
次の 1 つ以上の問題が発生しました: メソッドに指定された 1 つまたは複数の引数が無効です。 NamespaceManager または Create に指定された URI に 1 つまたは複数のパス セグメントが含まれています。 NamespaceManager または Create に指定された URI スキームが無効です。 プロパティ値が 32 KB を超えています。 |
呼び出し元のコードを確認し、引数が正しいことを確かめます。 | 再試行は役に立ちません。 |
サーバー ビジー | この時点では、このサービスで要求を処理できません。 | クライアントは、しばらく待ってから操作をやり直すことができます。 | クライアントは、特定の間隔の後に再試行することができます。 再試行の結果として別の例外が発生した場合は、その例外の再試行動作を確認します。 |
クォータを超過した | メッセージング エンティティが最大許容サイズに達しています。 | エンティティまたはそのサブキューからメッセージを受信して、エンティティ内に領域を作成します。 「 QuotaExceededException」を参照してください。 | メッセージがそれまでに削除されている場合は、再試行によって解決することがあります。 |
メッセージ サイズの超過 | メッセージ ペイロードが 256 KB の制限を超えています。 上限 256 KB は、メッセージの合計サイズです。 メッセージの合計サイズには、システム プロパティや Microsoft .NET のオーバーヘッドも含まれる場合があります。 | メッセージ ペイロードのサイズを小さくし、操作を再試行します。 | 再試行は役に立ちません。 |
QuotaExceededException
QuotaExceededException は、特定のエンティティのクォータが超過していることを示します。
Relay の場合、この例外は System.ServiceModel.QuotaExceededException をラップします。これは、このエンドポイントについてリスナーが最大数を超過したことを示します。 例外メッセージの MaximumListenersPerEndpoint 値に示されます。
TimeoutException
TimeoutException は、ユーザーが開始した操作が操作タイムアウトより時間がかかっていることを示します。
ServicePointManager.DefaultConnectionLimit プロパティの値を確認します。 この制限に達した場合も、TimeoutException が発生する場合があります。
Relay では、リレー送信者接続を最初に開いたときにタイムアウトの例外を受け取る可能性があります。 この例外の一般的な原因には、次の 2 つがあります。
- OpenTimeout 値が小さすぎる可能性があります (1 秒未満の場合など)。
- オンプレミスのリレー リスナーが反応していない (または、リスナーが新しいクライアント接続を受け入れられなくなるようなファイアウォール規則の問題が発生している) 可能性があります。また、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.
一般的な要因
このエラーの一般的な原因としては、次の 2 つがあります。
構成が正しくない
操作状態に対して、操作タイムアウトが小さすぎる可能性があります。 クライアント SDK の操作タイムアウトの既定値は 60 秒です。 コードの値が小さすぎる値に設定されていないか確認します。 CPU 使用率とネットワークの状態が、操作の完了に要する時間に影響を与える可能性があります。 操作タイムアウトに非常に小さい値を設定するのは避けることをお勧めします。
一時的なサービス エラー
場合によっては、Relay サービスで要求の処理が遅れることがあります。 トラフィックの多い時間帯などに発生することがあります。 発生した場合は、遅延の後、操作が成功するまで操作を再試行できます。 複数回試行しても同じ操作が失敗する場合は、Azure のサービス状態のサイトを確認し、既知のサービス停止がないかどうかを確認してください。
ConnectionLostException - NameRenewalFailed
現象
クライアントは例外を受け取ります: Microsoft.Azure.Relay.ConnectionLostException : InternalServerError: NameRenewalFailed
。
原因
Azure Relay サービスは、リスナー接続を 24 時間ごとに再起動します。 この動作は仕様によるものです。 Azure Relay サービスは、リスナーのアクティブな接続を 24 時間ごとに切断し、リスナーは再試行メカニズムを使用してサーバーに再接続します。
解決方法
リスナーがサーバーに自動的に再接続するため、アクションはありません。 リスナーが再び接続していないことに気付いた場合は、サポート チームにチケット を送信してください。