SPSite.Exists() returns true although the site collection doesn't exists
Asked Answered
I

2

6

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

Impropriate answered 6/7, 2009 at 16:6 Comment(0)
T
4

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) { }
    }
Teran answered 23/7, 2009 at 6:34 Comment(1)
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.Impropriate
J
6

I had this same issue and tried the HTTP request method but found it to be somewhat slow for checking a large number of sites at once. Instead i ended up using something like this:

public bool SPSiteExists(string url) {
    SPSite.InvalidateCacheEntry(new Uri(url), Guid.Empty);
    return SPSite.Exists(uri);
}
Jacquelynejacquelynn answered 24/9, 2012 at 20:13 Comment(2)
Seems that someone agree with me. If you ever happen to create an user on SharePoint Exchange, feel free to post on this question. Your discovery seems to be older than mine (just saw your question today, while searching for relations between this problem and the gradual deletion job). Link: sharepoint.stackexchange.com/questions/57553/…Kellie
No need for thanks. I have voted and accepted your version. I am still keeping mine for now because it contains some more info (reflector stuff) - may convert it to wiki though.Kellie
T
4

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) { }
    }
Teran answered 23/7, 2009 at 6:34 Comment(1)
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.Impropriate

© 2022 - 2024 — McMap. All rights reserved.