【问题标题】:SPSite.Exists() returns true although the site collection doesn't exists尽管网站集不存在,SPSite.Exists() 返回 true
【发布时间】:2012-09-25 04:13:51
【问题描述】:

我目前正在开发一个 TimerJob,它负责一些网站集管理。当作业运行时,它会查看一个列表以检索网站集的 URL,然后它会调用 SPSite.Exists() 来检查该网站是否仍然存在。

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

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

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

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


更新

所以我做了更多的调试,似乎这个问题确实是由某些缓存机制引起的,因为在删除测试网站集之后和 TimerJob 之前重新启动 Windows SharePoint Services Timer Service 时不会发生此问题开始了。

目前,除了尝试访问已删除的站点并捕获将引发的异常以确定该站点是否确实存在之外,我无法想象另一种解决方案。


更新 2

经过更多测试后,我意识到在 Timer Service 重新启动后,第一次调用 SPSite.Exists()(在 TimerJob 内)不会出现问题。第二次调用(针对不同的网站集)仍会导致已知问题。


更新 3

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

还有其他建议吗?

再见, 弗洛尔

【问题讨论】:

    标签: sharepoint timer-jobs


    【解决方案1】:

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

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

    【讨论】:

    • 似乎有人同意我的观点。如果您碰巧在 SharePoint Exchange 上创建了一个用户,请随时在此问题上发帖。你的发现似乎比我的更早(今天才看到你的问题,正在寻找这个问题与渐删作业的关系)。链接:sharepoint.stackexchange.com/questions/57553/…
    • 无需感谢。我已经投票并接受了你的版本。我现在仍然保留我的,因为它包含更多信息(反射器的东西) - 不过可能会将其转换为 wiki。
    【解决方案2】:

    我也一样。删除网站集后我遇到了类似的问题,但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) { }
        }
    

    【讨论】:

    • 与我的解决方案(更新 3)相比,您的解决方案避免了捕获异常。我喜欢这个。所以这将是对我的代码的改进。
    猜你喜欢
    • 2017-12-01
    • 1970-01-01
    • 2022-01-15
    • 2018-07-09
    • 1970-01-01
    • 2019-10-03
    • 2021-09-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多