6

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

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

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

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

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


更新

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

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


更新 2

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


更新 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 错误消息,而第二个请求请求是预期的 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) { }
    }
于 2009-07-23T06:34:29.027 回答