虽然网站集不存在,但SPSite.Exists()返回true

时间:2009-07-06 16:06:55

标签: sharepoint timer-jobs

我目前正在研究一种可以进行网站集管理的TimerJob。作业运行时,它会查找列表以检索网站集的Url,然后调用SPSite.Exists()来检查网站是否仍然存在。

要测试TimerJob,我删除了一个网站集,但在列表中留下了相应的条目。然后我启动TimerJob并在调试模式中逐步执行其代码。当涉及检查站点是否存在时,SPSite.Exists()返回true。

当我第二次为同一网站集运行TimerJob时,SPSite.Exists()方法会返回false。

所以现在我想知道为什么SPSite.Exists()在我第一次运行作业时返回错误的结果。这可能是由缓存引起的吗?

当我在TimerJob SPSite.Exists()之外运行相同的代码时,每次都会返回正确的结果。


更新

所以我做了一些调试,看起来这个问题确实是由一些缓存机制造成的,因为在删除测试网站集之后和TimerJob之前重新启动Windows SharePoint Services定时服务时不会发生这种情况。开始。

目前我无法想象另一种解决方案,而不是尝试访问已删除的网站并捕获将被抛出的异常以确定该网站是否真的存在。


更新2

经过一些测试后,我意识到在重新启动定时器服务后第一次调用SPSite.Exists()(在TimerJob中)时不会出现问题。第二次调用(针对不同的网站集)仍会导致已知问题。


更新3

目前我正在使用一个丑陋的黑客来解决我的问题。当SPSite.Exists()返回true但它实际上不存在时,我创建一个SPSite对象并尝试通过调用其Usage属性来激发FileNotFoundException。当异常出现时,我知道该网站不存在。抛出异常后奇怪的是,SPSite.Exists()返回正确的结果(false)。

还有其他建议吗?

再见 FLO

2 个答案:

答案 0 :(得分:6)

我遇到了同样的问题并尝试了HTTP请求方法,但发现一次检查大量网站有点慢。相反,我最终使用了这样的东西:

public bool SPSiteExists(string url) {
    SPSite.InvalidateCacheEntry(new Uri(url), Guid.Empty);
    return SPSite.Exists(uri);
}

答案 1 :(得分:4)

对我而言。删除网站集后我遇到了类似的问题我仍然认为SPSite.Exists();是真的 奇怪的是,如果我在浏览器中打开已删除的网站集URL - 第一个请求导致HTTP 400错误消息,而第二个请求是预期的HTTP 404。

我的解决方法是为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) { }
    }