Exchange における EWS での通知関連エラーの処理

Exchange の EWS マネージ API または EWS を使用して、開発したアプリケーションの通知に関連するエラーを処理する方法を確認します。

アプリケーションが通知をサブスクライブして取得する場合、通知に関連するエラーを処理する必要があります。 これらのエラーは実行時、または EWS アプリケーションを開発するときに処理することができます。

表 1. 通知に関連するエラーと、それらを処理する方法

エラー 発生するタイミング 処理方法
ErrorExceededConnectionCount アカウントがストリーミング接続の接続制限に達したときに、接続を開いてイベントを取得する場合。
  • 偽装を使用して、接続を開く
  • より少ない接続を使用してイベントを取得する。 アフィニティを使用して、同じグループに最大 200 のサブスクリプション ID を配置することで、各接続のサブスクリプション数を最大にします。 これで、同じ接続を使用して、グループ全体のイベントを取得し、必要な接続の数を削減することができるようになります。
  • オンプレミスの Exchange の web.config ファイルで HangingConnectionLimit の値を変更し、3 つの開いている接続の既定値をオーバーライドする。 Exchange Online には、10 の既定の HangingConnectionLimit があり、これを構成することはできません。
ErrorExceededSubscriptionCount 作成するサブスクリプションが多すぎる場合。 EwsMaxSubscriptions 調整ポリシー パラメーターが、アカウントで作成できるサブスクリプションの最大数を決定します。
ErrorInvalidSubscriptionRequest 1 つの要求から複数のメールボックスまたは複数のフォルダーに対してサブスクリプションを作成する場合。 1 つの要求で 1 つのパブリック フォルダーまたは 1 つのメールボックスに対してサブスクリプションを作成する。
ErrorInvalidWatermark 無効な基準値を使用してイベントを取得する場合。
ErrorMissedNotificationEvents 以前のイベントがないイベントを取得する場合。 拡張フォルダーのプロパティ PR_LOCAL_COMMIT_TIME_MAX (0x670a) と PR_DELETED_COUNT_TOTAL (0x670b) を比較し、どの変更がないのかを特定し、新しいサブスクリプションを作成する
ErrorProxyRequestNotAllowed メールボックスが別のサイトに移動しているユーザーに対して、バッチ要求でイベントをサブスクライブする場合。 自動検出を使用して、ExternalEwsUrl または EwsPartnerUrl を再検出し、新しいサブスクリプションを作成する。
ErrorReadEventsFailed 見つからないサブスクリプションからイベントを取得する場合。 自動検出を使用して、ExternalEwsUrl または EwsPartnerUrl を再検出し、新しいサブスクリプションを作成する。
ErrorServerBusy 調整制限を超過した場合。 調整に関する次の点に注意してください。
  • EwsMaxSubscriptions 調整制限により、一度にアクティブにできるプッシュ、プル、またはストリーミングの通知サブスクリプションの最大数が指定されます。 これはメールボックスのサブスクリプションの値です。メールボックス サブスクリプション内にある個々のフォルダーのサブスクリプション数ではありません。 サービス メールボックスのバージョン 14.16.0135 および 14.15.0057.000 以降では、Exchange Online または Office 365 の一部としての Exchange Online によってホストされるメールボックスは、最大 20 のサブスクリプション、対象になる Exchange 2013 のオンプレミスのメールボックスは最大 5,000 のサブスクリプションを持つことができます。
  • EwsMaxConcurrency 調整制限により、非ストリーミング接続のアクティブな要求の最大数が指定されます。既定値は 27 です。
  • 開いているストリーミング接続の既定の制限値は 10 です。
  • 通知に関連する調整ポリシーの影響を考慮し、アプリケーションが調整されないようにアクティブなサブスクリプションとアクティブな接続の数を制限する。
  • より少ない接続を使用してイベントを取得する。 同じグループに最大 200 のサブスクリプション ID を配置することで、各接続のサブスクリプション数を最大にします。 これで、同じ接続を使用して、グループ全体のイベントを取得し、必要な接続の数を削減することができるようになります。
  • web.config ファイルの HangingConnectionLimit の値を変更し、開くことができるストリーミング接続の既定値 10 をオーバーライドする。
ErrorSubscriptionNotFound 見つからないサブスクリプションのイベントを取得します。 サブスクリプションの有効期限が切れているか、EWS プロセスが再起動されたか、無効なサブスクリプションが渡された可能性があります。
  • 前の応答で返されたのと同じサブスクリプション ID を使用していることを確認する。
  • 正しい ExchangeService オブジェクトのサブスクリプション ID を送信していることを確認する。
  • 新しいサブスクリプションを作成する
ServiceLocalException サブスクリプションの接続が別のフォルダーで開いている間に、新しいフォルダーにサブスクリプションを追加します。 サブスクリプションを変更して、特定のフォルダーではなく、メールボックス内のすべてのフォルダーをサブスクライブする。
ServiceResponseException Exchange ストア内にないサブスクリプションのイベントを取得する場合。
  • 前の応答で返されたのと同じサブスクリプション ID を使用していることを確認する。
  • 正しい ExchangeService オブジェクトのサブスクリプション ID を送信していることを確認する。

失われたサブスクリプションから回復する

サブスクリプションが失われる、またはアクセスできなくなった場合は、新しいサブスクリプションを作成し、新しいサブスクリプションに古い基準値を含めないことをお勧めします。 古い基準値を使用して再度サブスクライブすると、イベントが線形にスキャンされるためコストがかかります。 代わりに、新しいサブスクリプションを作成し、フォルダーのプロパティを比較して、失われたサブスクリプションと新しいサブスクリプションの間で発生したコンテンツ変更を検索します。 確認することをお勧めする拡張フォルダー プロパティは、PR_LOCAL_COMMIT_TIME_MAX (0x670a0040) と PR_DELETED_COUNT_TOTAL (0x670b0003) です。 これを行うには、拡張プロパティの定義を作成します

関連項目