私は現在、いくつかのサイトコレクション管理を行うTimerJobに取り組んでいます。SPSite.Exists()
ジョブが実行されると、リストを調べてサイトコレクションのURLを取得し、サイトがまだ存在するかどうかを確認するために呼び出します。
TimerJobをテストするために、サイトコレクションを削除しましたが、対応するエントリをリストに残しました。次に、TimerJobを開始し、デバッグモードでそのコードをステップ実行します。サイトが存在するかどうかを確認するポイントになると、SPSite.Exists()
trueが返されます。
同じサイトコレクションに対してTimerJobを2回実行すると、SPSite.Exists()
メソッドはfalseを返します。
SPSite.Exists()
だから今、私が初めてジョブを実行したときになぜ誤った結果を返すのか疑問に思っています。これはキャッシングが原因でしょうか?
TimerJobの外部で同じコードを実行すると、SPSite.Exists()
毎回正しい結果が返されます。
アップデート
そこで、さらにデバッグを行いました。この問題は、テストサイトコレクションが削除された後、TimerJobが開始される前に、Windows SharePoint Services Timer Serviceが再起動されたときに発生しないため、実際にはキャッシュメカニズムが原因であると思われます。
現時点では、削除されたサイトにアクセスして、サイトが実際に存在するかどうかを判断するためにスローされる例外をキャッチする以外に、別の解決策を想像することはできません。
更新2
さらにいくつかのテストを行った後、タイマーサービスが再起動された後のSPSite.Exists()(TimerJob内)の最初の呼び出しでは問題が発生しないことに気付きました。2番目の呼び出し(別のサイトコレクションの場合)でも、既知の問題が発生します。
更新3
現在、私は自分の問題を解決するために醜いハックを使用しています。SPSite.Exists()が実際には存在しないのにtrueを返す場合、SPSiteオブジェクトを作成し、Usageプロパティを呼び出してFileNotFoundExceptionを引き起こそうとします。例外が発生したとき、私はそのサイトが存在しないことを知っています。不思議なことに、例外がスローされた後、SPSite.Exists()は正しい結果(false)を返します。
他に何か提案はありますか?
さようなら、フロ