6

私は現在、いくつかのサイトコレクション管理を行う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)を返します。

他に何か提案はありますか?

さようなら、フロ

4

2 に答える 2

6

これと同じ問題が発生し、HTTPリクエスト方式を試しましたが、一度に多数のサイトをチェックするには時間がかかることがわかりました。代わりに、私は次のようなものを使用することになりました:

public bool SPSiteExists(string url) {
    SPSite.InvalidateCacheEntry(new Uri(url), Guid.Empty);
    return SPSite.Exists(uri);
}
于 2012-09-24T20:13:51.187 に答える
4

わたしも。サイトコレクションを削除した後も同様の問題が発生しましたが、それでも真実でしSPSite.Exists(); た。奇妙なことに、削除したサイトコレクションのURLをブラウザで開くと、最初のリクエストでHTTP 400エラーメッセージが表示され、2番目のリクエストでHTTP400エラーメッセージが表示されました。リクエストは予想されたHTTP404でした。

私の回避策は、URLのHTTP GETを作成して最初のリクエストを作成し、サイトの存在を再度確認することでした。

    private void touchWeb(string url, System.Net.ICredentials credentials)
    {
        try
        {
            Uri uri = new Uri(url);
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
            request.Credentials = credentials;

            request.Method = "GET";
            string result = "";
            using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
            {
                using (Stream responseStream = response.GetResponseStream())
                {
                    using (StreamReader readStream = new StreamReader(responseStream, System.Text.Encoding.UTF8))
                    {
                        result = readStream.ReadToEnd();
                    }
                }
            }
        }
        catch (Exception) { }
    }
于 2009-07-23T06:34:29.027 に答える