Flo*_*Flo 6 sharepoint timer-jobs
我目前正在研究一种可以进行网站集管理的TimerJob.当作业运行时,它会查找列表以检索网站集的Url,然后调用SPSite.Exists()以检查该网站是否仍然存在.
为了测试TimerJob,我删除了一个网站集,但是在列表中留下了相应的条目.然后我启动TimerJob并在调试模式中逐步执行其代码.当涉及到检查站点是否存在的点SPSite.Exists()返回true.
当我第二次为同一网站集运行TimerJob时,该SPSite.Exists()方法返回false.
所以现在我想知道为什么SPSite.Exists()当我第一次运行这个工作时返回错误的结果.这可能是由缓存引起的吗?
当我在TimerJob之外运行相同的代码时,每次都SPSite.Exists()返回正确的结果.
UPDATE
所以我做了一些调试,看起来这个问题确实是由一些缓存机制造成的,因为在删除测试网站集之后和TimerJob启动之前重新启动Windows SharePoint Services定时服务时不会发生这种情况.
目前我无法想象另一种解决方案,而不是尝试访问已删除的网站并捕获将被抛出的异常,以确定该网站是否真的存在.
更新2
经过一些测试后,我意识到重新启动定时器服务后第一次调用SPSite.Exists()(在TimerJob中)时不会出现问题.第二次调用(针对不同的网站集)仍会导致已知问题.
更新3
目前我正在使用一个丑陋的黑客来解决我的问题.当SPSite.Exists()返回true但它实际上不存在时,我创建一个SPSite对象并尝试通过调用其Usage属性来激发FileNotFoundException.当异常出现时,我知道该网站不存在.抛出异常后奇怪的是,SPSite.Exists()返回正确的结果(false).
还有其他建议吗?
再见,弗洛
我有同样的问题并尝试了HTTP请求方法,但发现一次检查大量网站有点慢.相反,我最终使用这样的东西:
public bool SPSiteExists(string url) {
SPSite.InvalidateCacheEntry(new Uri(url), Guid.Empty);
return SPSite.Exists(uri);
}
Run Code Online (Sandbox Code Playgroud)
我也是。删除网站集后,我遇到了类似的问题,但我仍然遇到了SPSite.Exists();
奇怪的事情是,如果我在浏览器中打开已删除的网站集 URL,第一个请求会导致 HTTP 400 错误消息,而第二个请求会导致 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) { }
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
3961 次 |
| 最近记录: |