views:

856

answers:

1

I'm currently working on a TimerJob which does some site collections management. When the job runs it looks into a list to retrieve the Url of a site collection then it calls SPSite.Exists() to check if the site still exists or not.

To test the TimerJob I delete a site collection but left the corresponding entry in the list. Then I start the TimerJob and step through its code in debug mode. When it comes to the point to check whether the site exists SPSite.Exists() returns true.

When I run the TimerJob a second time for the same site collection the SPSite.Exists() method returns false as it should.

So now I'm wondering why SPSite.Exists() returns the false result when I run the job for the first time. Could this be caused by caching?

When I run the same code outside of the TimerJob SPSite.Exists() returns the correct result every time.


UPDATE

So I did some more debugging and it seems as this problem is really caused by some caching mechanism as it doesn't occur when the Windows SharePoint Services Timer Service was restarted after the test site collection has been deleted and before the TimerJob was started.

At the moment I can't imagine another solution than trying to access the deleted site and catching the exception that will be thrown to determine if the site really exists.


UPDATE 2

After some more tests I realized that the problem doesn't occur for the first call of SPSite.Exists() ( within the TimerJob) after the Timer Service is restarted. The second call (for a different site collection) still leads to the known problem.


UPDATE 3

At the moment I'm using an ugly hack to solve my problem. When SPSite.Exists() returns true although it actually doesn't exist, I create a SPSite object and try to provoke a FileNotFoundException by calling its Usage property. When the exceptions arise I know that the site doesn't exist. Strangely enough after the exception was thrown SPSite.Exists() returns the correct result (false).

Any other suggestions out there?

Bye, Flo

+2  A: 

Same for me. I had a similar problem after I deleted a site-collection I still got true for SPSite.Exists(); The strange thing was, that if i opened the deleted site-collection URL in a browser - the first request resulted in a HTTP 400 error message, whereas the second request was the expected HTTP 404.

My workaround was to just create a HTTP GET for the URL to create the first request and then check for site existence again.

    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) { }
    }
Henrik
Compared to my solution (Update 3) your solution avoids to catch an exception. I like this. So this would be an improvement to my code.
Flo